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

时间:2015-04-09 11:32:21

标签: android android-viewholder android-recyclerview

在互联网上的教程中,他们在RecyclerView的Adapter中设置了setOnClickListener,他们以两种方式定义它:在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();
            }
        });
    }

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

5 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

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

例如,如果单击一个Button并且您想要更改按钮的文本,那么您应该使用在ViewHolder中设置onClick侦听器的选项。除此之外,它还使您的代码看起来更清晰。

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

答案 2 :(得分:2)

恕我直言:我喜欢第1名。

由于您在实际显示内容之前调用new ViewHolder(View)真正设置了onClickListener。这很好,因为在调用onBindView时,你的onClickListener已经在你的视图上设置了。

我认为在构造函数ViewHolder(View)

中执行此操作也更简洁

答案 3 :(得分:1)

ViewHolder()中我想,因为你定义了view所拥有的内容以及内部和其他功能。

onBindViewHolder()你说在view中定义的ViewHolder会有这个文字,这张图片......

答案 4 :(得分:0)

您应该始终检查getAdapterPosition是否> = 0,因为在极少数情况下它可能为-1(NO_POSITION),这可能导致应用程序崩溃。 https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ViewHolder#getadapterposition