Home > Software engineering >  How to access MyViewHolder inner class views outside RecyclerViewAdapter?
How to access MyViewHolder inner class views outside RecyclerViewAdapter?

Time:07-01

I have a MyViewHolder inner class inside RecyclerViewAdapter inside Checklistitems class. I want access elements of MyViewHolder in method onOptionItemSelected(). Here, I have three classes, and because of that, it becomes more complicated for me.

public class ChecklistItems extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_checklist_items);
}

public class ChecklistAdapter extends RecyclerView.Adapter  <RecyclerView.ViewHolder>{

    @NonNull
    @Override
    public RecyclerView.ViewHolder  onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new ChecklistChildViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
      
    }

    @Override
    public int getItemCount() {
        return x;
    }

    public class ChecklistChildViewHolder extends RecyclerView.ViewHolder{
        CheckBox checkBox;
        ImageView delete, move;

        ChecklistChildViewHolder(@NonNull View itemView) {
            super(itemView);
            checkBox = itemView.findViewById(R.id.checkbox_child);
            delete = itemView.findViewById(R.id.delete_child);
            move = itemView.findViewById(R.id.move_child);
            delete.setVisibility(View.INVISIBLE);
        }
    }
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    switch (item.getItemId()){

        case R.id.edit:
            isEditChecklist = true;
            // My problem is in here
            // I want to set visibility of a delete imageView here, when I clicked edit button in the toolbar
            // I have created these objects in order to access the ChecklistChildViewHolder class but the third line below asks
            // for a parameter, I don't know what to pass

            ChecklistItems checklistItems = new ChecklistItems();
            ChecklistItems.ChecklistAdapter checklistAdapter = checklistItems.new ChecklistAdapter();
            ChecklistAdapter.ChecklistChildViewHolder checklistChildViewHolder = checklistAdapter.new ChecklistChildViewHolder();
    }
    return true;
}
}

Any help would be appreciated.

CodePudding user response:

Don't do that. The ViewHolders belong to the adapter. Just add a method in the adapter class to do what you want, in onOptionsItemSelected() call the method on the adapter. The adapter has direct access to all the ViewHolders and can do whatever is needed.

CodePudding user response:

Update your code like this

Your Activity

public class ChecklistItems extends AppCompatActivity {

private ChecklistAdapter mAdapter;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_checklist_items);
    mAdapter = new ChecklistAdapter();
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    switch (item.getItemId()){

        case R.id.edit:
            isEditChecklist = true;
            mAdapter.updateItems(true);
    }
    return true;
}
}

Your Adapter

public class ChecklistAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

private boolean isEnableDelete = false;

@NonNull
@Override
public RecyclerView.ViewHolder  onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    return new ChecklistChildViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

    ((ChecklistChildViewHolder) holder).onBind(isEnableDelete);
}

@Override
public int getItemCount() {
    return x;
}

public void updateItems(boolean isEnableDelete){
    this.isEnableDelete = isEnableDelete;
    notifyDataSetChanged();

}

public class ChecklistChildViewHolder extends RecyclerView.ViewHolder{
    CheckBox checkBox;
    ImageView delete, move;

    ChecklistChildViewHolder(@NonNull View itemView) {
        super(itemView);
        checkBox = itemView.findViewById(R.id.checkbox_child);
        delete = itemView.findViewById(R.id.delete_child);
        move = itemView.findViewById(R.id.move_child);
        delete.setVisibility(View.INVISIBLE);
    }

    public void onBind(boolean isEnableDelete){
        if (isEnableDelete){
            delete.setVisibility(View.VISIBLE);
        }else delete.setVisibility(View.INVISIBLE);
    }
}
}
  • Related