Adapter tworzysz dla POJEDYNCZEGO elementu listy. Do każdego masz tak na prawdę przypisane jedno id text view. Więc dobierasz się do niego dokładnie w taki sam sposób jakbyć chciał mu zmienić tekst. Jednak jeśli chcesz zmienić tylko wybranym no to musisz się odwoływać po ID w liście.
Nie o to mi chodziło. Być może nie jasno zadałem pytanie więc zamieszczam przykładowy kod:
onOptionsItemSelected
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.coscos:
mRvAdapter.changeVisiblity();
break;
}
return super.onOptionsItemSelected(item);
}
RecyclerView.Adapter:
class RvAdapter extends RecyclerView.Adapter<RvAdapter.ViewHolder> {
private final Context mContext;
private final ArrayList mData;
public RvAdapter(Context context, ArrayList data) {
mContext = context;
mData = data;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View rowView = LayoutInflater.from(mContext).inflate(R.layout.recycler_row, parent, false);
ViewHolder viewHolder = new ViewHolder(rowView);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
final jakisObiekt jakisObiekt = mData.get(position);
holder.textViewVisible.setText(jakisObiekt.getVisibleText);
holder.textViewGone.setText(jakisObiekt.getGoneText);
}
@Override
public int getItemCount() {
return mData.size();
}
public void changeVisiblity(){
//
}
public class ViewHolder extends RecyclerView.ViewHolder {
public TextView textViewVisible;
public TextView textViewGone;
public ViewHolder(View itemView) {
super(itemView);
this.textViewVisible = (TextView) itemView.findViewById(R.id.textViewVisible);
this.textViewGone = (TextView) itemView.findViewById(R.id.textViewGone);
}
}
}
Jeszcze raz zadam pytanie na przykładzie tego kodu, może będzie bardziej zrozumiałe.
W jaki sposób poprzez metodę changeVisiblity zmienić we wszystkich elementach listy, wartość elementu na taką textViewGone.setVisibility(View.VISIBLE) ??
------------------------------------------------------------------------------------------
Nim zdążyłem napisać powyższy kod znalazłem 2 rozwiązania mojego problemu:
1 Rozwiązanie:
W klasie RvAdapter utworzyć zmienną globalną:
public ArrayList<ViewHolder> mHolder = new ArrayList<>();
W metodzie onBindViewHolder:
public void onBindViewHolder(final ViewHolder holder, final int position) {
mHolder.add(holder);
..........................................
}
Dokonać zmiany widoczności w niniejszy sposób:
public void changeVisiblity(){
for (ViewHolder vh: mHolder) {
vh.textViewGone.setVisibility(View.VISIBLE);
}
}
Sposób działa, tekst się pojawia, bez potrzeby wywoływania notifyDataSetChanged()
2 Rozwiązanie:
W klasie RvAdapter utworzyć zmienną globalną:
public boolean mShowText = false;
W metodzie onBindViewHolder:
public void onBindViewHolder(final ViewHolder holder, final int position) {
..........................................
if (mShowText) {
holder.textViewGone.setVisibility(View.VISIBLE);
}
..........................................
}
W metodzie changeVisiblity:
public void changeVisiblity(){
mShowText = true;
notifyDataSetChanged();
}
W tym rozwiązaniu potrzebne jest wywołanie notifyDataSetChanged();
Co myślicie o powyższych rozwiązaniach? Może jest jakiś inny sposób zmiany widoczności zmiennej textViewGone, bez dokonywania zmian w adapterze. Może jakoś poprzez RecyclerView do którego dodawany jest adapter? Moje wszystkie sposoby rozwiązania problemu bez modyfikacji adaptera kończyły się modyfikacją tylko pierwszego bądź ostatniego elementu listy.