RecyclerView - How do I pass the position of onBindViewHolder to my ViewHolder class?

天大地大妈咪最大 提交于 2019-12-13 03:38:17

问题


I am trying to setup onClickListeners inside my ViewHolder class, but I need the position of each. How can I pass the position from onBindViewHolder to my ViewHolder class?

@NonNull
@Override
public AdapterAllComments.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.model_rv_allcomments_container, viewGroup, false);

    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull AdapterAllComments.ViewHolder viewHolder, int position) {


}

@Override
public int getItemCount() {
    return mCommentId.size();
}

public class ViewHolder extends RecyclerView.ViewHolder{



    LinearLayout viewHolderLayout;


    public ViewHolder(@NonNull View itemView) {
        super(itemView);

        viewHolderLayout = itemView.findViewById(R.id.item_child_layout);

    }
}

回答1:


this adapter from my other project :

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

    private List<String> mData;
    private LayoutInflater mInflater;
    private ItemClickListener mClickListener;
    private Context context;

    public ChildrenRvAdapter(Context context, List<String> data) {
        this.mInflater = LayoutInflater.from(context);
        this.mData = data;
        this.context = context;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.children_rv_row, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        String name = mData.get(position);
        holder.tv_name.setText(name);
        setAnimation(holder.itemView, position);
    }

    @Override
    public int getItemCount() {
        return mData.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView tv_name;
        Button btn_remove;

        ViewHolder(View itemView) {
            super(itemView);
            tv_name = itemView.findViewById(R.id.tv_name);
            btn_remove = itemView.findViewById(R.id.btn_remove);
            btn_remove.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
        }
    }

    String getItem(int id) {
        return mData.get(id);
    }

    public void setClickListener(ItemClickListener itemClickListener) {
        this.mClickListener = itemClickListener;
    }

    public interface ItemClickListener {
        void onItemClick(View view, int position);
    }

    }
}

so you create interface in your adapter and also declare it in local mClickListener and implement it in ViewHolder class and setonclick where you create the viewholder:

    ViewHolder(View itemView) {
        super(itemView);
        tv_name = itemView.findViewById(R.id.tv_name);
        btn_remove = itemView.findViewById(R.id.btn_remove);
        btn_remove.setOnClickListener(this);
    }

just note that i set it on a button but you can set it on itemView also on any view that have the setOnClickListener so you can use :

itemView.setOnClickListener(this);

then from your activity or fragment and wherever using the adapter, just implemet the onlick interface and after initializing the adapter use the method that we created public void setClickListener in our adapter, to local interface in the adapter

 public void setClickListener(ItemClickListener itemClickListener) {
    this.mClickListener = itemClickListener;
}

activity:

public class ChildrenEditDialog extends Dialog implements IChildren.IView, ChildrenRvAdapter.ItemClickListener

and in activity onCreate or somewhere else:

 childrenRvAdapter = new ChildrenRvAdapter(c, dataSource);
    childrenRvAdapter.setClickListener(this);

and you have onlcick in your activity/fragment/dialog/etc...




回答2:


Use ViewHolders getAdapterPosition() for getting current position of ViewHolder.




回答3:


To get the current position of the onBindViewHolder to ViewHolder class getAdapterPosition() can be used.

As an example,

public class ViewHolder extends RecyclerView.ViewHolder{
    LinearLayout viewHolderLayout;

    viewHolderLayout = itemView.findViewById(R.id.item_child_layout);

    public ViewHolder(@NonNull View itemView) {
        super(itemView);

        viewHolderLayout.setOnClickListener(v -> {
            lastClickedPosition = getAdapterPosition();
        });

    }
}


来源:https://stackoverflow.com/questions/56713923/recyclerview-how-do-i-pass-the-position-of-onbindviewholder-to-my-viewholder-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!