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

问题描述 投票:0回答:5

在互联网上的教程中,他们在 RecyclerView 的适配器中设置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();
            }
        });
    }

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();
        }
    });
}    
java android android-recyclerview android-viewholder
5个回答
5
投票

您的第 1 号解决方案是您建议的最佳解决方案,因为在每次由 notification..() 方法触发的无效时,不会在绑定中调用该分配。 我也知道其他解决方案,但你需要在你的活动中实现 android.view.GestureDetector 。

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


4
投票

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

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

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


2
投票

恕我直言:我喜欢数字 1。

自从您调用

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

我认为在构造函数中执行此操作的代码也更清晰

ViewHolder(View)


1
投票

ViewHolder()
中,我猜,因为您定义了
view
所持有的内容以及它的内部功能和其他功能。

但是

onBindViewHolder()
你说
view
,它在
ViewHolder
中定义,将会有这个文本,这个图像......


0
投票

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

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.