![](/img/trans.png)
[英]Passing variable(position) from onBindViewHolder to ViewHolder class
[英]RecyclerView - How do I pass the position of onBindViewHolder to my ViewHolder class?
我正在尝试在ViewHolder类中设置onClickListeners,但是我需要每个位置。 如何将位置从onBindViewHolder传递给ViewHolder类?
@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);
}
}
这个适配器来自我的其他项目:
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);
}
}
}
因此,您可以在适配器中创建interface
,还可以在本地mClickListener
声明interface
,并在ViewHolder类和setonclick
在创建setonclick
位置进行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);
}
只是请注意,我把它放在一个button
但你可以把它放在itemView
还上的任何view
认为有setOnClickListener
所以你可以使用:
itemView.setOnClickListener(this);
然后从您的活动或片段以及无论使用适配器的任何地方,只需实现onlick
interface
并在初始化适配器后,使用我们在适配器中创建public void setClickListener
onlick
的方法,即可到适配器的本地接口
public void setClickListener(ItemClickListener itemClickListener) {
this.mClickListener = itemClickListener;
}
活动:
public class ChildrenEditDialog extends Dialog implements IChildren.IView, ChildrenRvAdapter.ItemClickListener
在活动onCreate
或其他地方:
childrenRvAdapter = new ChildrenRvAdapter(c, dataSource);
childrenRvAdapter.setClickListener(this);
并且您的活动/片段/对话/等中有onlcick ...
使用ViewHolders getAdapterPosition()
获取ViewHolder的当前位置。
要将onBindViewHolder的当前位置获取到ViewHolder类,可以使用getAdapterPosition()
。
举个例子,
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();
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.