Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 我应该将setOnClickListener放置在RecyclerView适配器的何处_Android_Android Viewholder_Android Recyclerview - Fatal编程技术网

Android 我应该将setOnClickListener放置在RecyclerView适配器的何处

Android 我应该将setOnClickListener放置在RecyclerView适配器的何处,android,android-viewholder,android-recyclerview,Android,Android Viewholder,Android Recyclerview,在internet上的教程中,他们在RecyclerView的适配器中设置ClickListener,他们用两种方式定义它:在ViewHolder内部或在BindViewHolder内部 我的问题是哪种方法更好,请推荐其他方法(如果可用) 1) 内视窗座: public static class ViewHolder extends RecyclerView.ViewHolder { public ViewHolder(View itemView) { super(it

在internet上的教程中,他们在RecyclerView的适配器中设置ClickListener,他们用两种方式定义它:在ViewHolder内部或在BindViewHolder内部

我的问题是哪种方法更好,请推荐其他方法(如果可用)

1) 内视窗座:

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) 内置活页夹

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();
        }
    });
}    
ViewHolder()
中,我想,因为您定义了
view
所包含的内容以及它的内部功能和其他功能


但是
onBindViewHolder()
你说
view
,它是在
ViewHolder
中定义的,将有这个文本,这个图像…

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


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

中实现这一点的代码也更简洁,正如您所建议的那样,您的1号解决方案是最好的,因为notify..()方法触发的每个invalidate()方法都不会在绑定中调用该赋值。 我也知道其他解决方案,但您需要在活动中实现android.view.GestureDetector


如果您希望对适配器进行其他改进,请查看我的FlexibleAdapter,并在您的项目中自由实施。

这两个选项都有其优缺点

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


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

您应该始终检查getAdapterPosition是否>=0,因为它可能是-1(无位置)在极少数情况下,会导致应用程序崩溃

让您的自定义ViewHolder实现View.OnClickListener,这样您就不需要ViewHolder中的自定义View.OnClickListener类这没有任何意义,您可以在这两种情况下同时执行这两种操作