我应该在哪里将setOnClickListener放在RecyclerView适配器中

Anu*_*iya 8 android android-viewholder android-recyclerview

在互联网上的教程中,他们在RecyclerView的Adapter中设置了OnClickListener,它们以两种方式定义它:在ViewHolder内部或在BindViewHolder内部.

我的问题是哪一个是更好的方法,请推荐任何其他方法(如果有的话)

1)在ViewHolder中:

public static class ViewHolder extends RecyclerView.ViewHolder {

    public ViewHolder(View itemView) {
        super(itemView);
        tvSrc = (TextView) itemView.findViewById(R.id.tvSrc);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(v.getContext(), "inside viewholder position = " + getAdapterPosition(), Toast.LENGTH_SHORT).show();
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)

2)在BindViewHolder里面

public void onBindViewHolder(DisplayTrainsAdapter.ViewHolder viewHolder, final int position) {

    viewHolder.tvSrc.setText(mDataset.get(position).strSrc);
    viewHolder.tvSrc.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Toast.makeText(v.getContext(), "position = " + getItemId(position), Toast.LENGTH_SHORT).show();
        }
    });
}    
Run Code Online (Sandbox Code Playgroud)

Dav*_*eas 5

你提出的1号解决方案是最好的解决方案,因为在notify ..()方法触发的每个invalidate中,不会在Binding中调用该赋值.我也知道其他解决方案但你需要在你的活动中实现android.view.GestureDetector.

如果您希望其他人对适配器进行改进,请查看我的FlexibleAdapter https://github.com/davideas/FlexibleAdapter,随时在您的项目中实施.


Adv*_*t S 4

两种选择都有其优点和缺点。

例如,如果单击按钮并且您想要更改按钮的文本,那么您可能应该使用在 ViewHolder 中设置 onClick 侦听器的选项。除了这个原因之外,它还使您的代码看起来更干净。

但是,如果单击按钮时,您想要在与单击的按钮相同的索引/位置中更改 TextView 的文本,则需要使用在 onBindViewHolder 方法中设置 onClick 侦听器的选项。