RecyclerView-如何将onBindViewHolder的位置传递给ViewHolder类? [英] RecyclerView - How do I pass the position of onBindViewHolder to my ViewHolder class?

查看:374
本文介绍了RecyclerView-如何将onBindViewHolder的位置传递给ViewHolder类?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在ViewHolder类中设置onClickListeners,但是我需要每个位置.如何将位置从onBindViewHolder传递给我 ViewHolder类?

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);

    }
}

推荐答案

我其他项目中的此适配器:

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);
    }

    }
}

因此您在适配器中创建interface,并在本地mClickListener中声明它,并在ViewHolder类和setonclick中在创建viewholder的位置实现它:

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);
    }

请注意,我将其设置在上,但是您可以将其设置在itemView上 在具有setOnClickListener的任何view上也是如此,因此您可以使用:

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);

然后从您的活动或片段以及无论使用适配器的任何地方,只需实现onlick interface,并在初始化适配器后,使用我们在适配器中创建的public void setClickListener的方法,即可到适配器的本地接口

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;
}

活动:

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

和活动onCreate或其他地方:

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

您的活动/片段/对话/等中有onlcick ...

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

这篇关于RecyclerView-如何将onBindViewHolder的位置传递给ViewHolder类?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆