首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OnClickListener for RecyclerView

OnClickListener for RecyclerView
EN

Stack Overflow用户
提问于 2015-09-25 10:15:12
回答 6查看 14.7K关注 0票数 3

与ListView不同的是,Android RecyclerView的实现似乎太复杂了。由于没有用于OnItemClickListener子级的RecyclerView,所以我一直试图实现以下操作来注册单击事件:

代码语言:javascript
运行
复制
final RecyclerView rv=(RecyclerView)findViewById(R.id.recycler_view);
    LinearLayoutManager llm=new LinearLayoutManager(this);
    rv.setLayoutManager(llm);
    MyRVAdapter rva=new MyRVAdapter(persons);
    rv.setAdapter(rva);

    rv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int itemPosition = rv.indexOfChild(v);
            Log.d("Tag", String.valueOf(itemPosition));
        }
    });

由于某些原因,我无法让这段代码正常工作。单击事件根本没有注册!有人能告诉我我做错了什么吗?我已经看到了一些解决方案,但我认为这应该是可行的。谢谢你的帮忙!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-09-25 10:47:50

而不是为整个RecyclerView设置onclicklistener,而是在Adapter.类的构造函数中设置它

一些示例代码将类似于下面的类,它是回收视图适配器中的一个内部类。

代码语言:javascript
运行
复制
     class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

      .....
        public ViewHolder(View itemView) {
            super(itemView);
           .......
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {

           .......
        }
    }

在适配器的onCreateViewHolder内部,将充气视图传递给ViewGroup的构造函数,

代码语言:javascript
运行
复制
 @Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.your_layout, viewGroup, false);
    ViewHolder viewHolder = new ViewHolder(v);
    return viewHolder;
}    
票数 5
EN

Stack Overflow用户

发布于 2016-06-15 21:52:59

虽然已经有了一些答案,但我想我也可以给我的实现提供一个解释。(详细信息可在我回答了另一个类似的问题上找到)。

因此,要添加单击侦听器,您的内部ViewHolder类需要实现View.OnClickListener。这是因为您将将OnClickListener设置为ViewHolder的构造函数的itemView参数。

代码语言:javascript
运行
复制
public class ExampleClickViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    TextView text1, text2;

    ExampleClickViewHolder(View itemView) {
        super(itemView);

        // we do this because we want to check when an item has been clicked:
        itemView.setOnClickListener(this);

        // now, like before, we assign our View variables
        title = (TextView) itemView.findViewById(R.id.text1);
        subtitle = (TextView) itemView.findViewById(R.id.text2);
    }

    @Override
    public void onClick(View v) {
        // The user may not set a click listener for list items, in which case our listener
        // will be null, so we need to check for this
        if (mOnEntryClickListener != null) {
            mOnEntryClickListener.onEntryClick(v, getLayoutPosition());
        }
    }
}

您需要添加的惟一其他内容是Adapter的自定义接口和setter方法:

代码语言:javascript
运行
复制
private OnEntryClickListener mOnEntryClickListener;

public interface OnEntryClickListener {
    void onEntryClick(View view, int position);
}

public void setOnEntryClickListener(OnEntryClickListener onEntryClickListener) {
    mOnEntryClickListener = onEntryClickListener;
}

因此,您的新的、支持单击的Adapter已经完成。

现在,让我们用它..。

代码语言:javascript
运行
复制
    ExampleClickAdapter clickAdapter = new ExampleClickAdapter(yourObjects);
    clickAdapter.setOnEntryClickListener(new ExampleClickAdapter.OnEntryClickListener() {
        @Override
        public void onEntryClick(View view, int position) {
            // stuff that will happen when a list item is clicked
        }
    });

这基本上是您将如何设置一个普通的Adapter,除了使用您创建的setter方法来控制当您的用户单击特定的列表项时将做什么。

我在GitHub上的这个要旨上创建了一组示例,这些示例显示了可以用作模板的完整Adapter文件,或者帮助您理解Adapter的工作原理。

票数 4
EN

Stack Overflow用户

发布于 2016-08-16 08:44:32

似乎您已经得到了问题的答案,但是这里没有一个答案试图使用RxJava来解决这个问题。

我本人是RxJava的忠实粉丝,我从不错过任何可能使用它的机会。

我用的是这个,

代码语言:javascript
运行
复制
public class ReactiveAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    String[] mDataset = { "Data", "In", "Adapter" };

    private final PublishSubject<String> onClickSubject = PublishSubject.create();

    @Override 
    public void onBindViewHolder(final ViewHolder holder, int position) {
        final String element = mDataset[position];

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               onClickSubject.onNext(element);
            }
        });
    }

    public Observable<String> getPositionClicks(){
        return onClickSubject.asObservable();
    }
}

它公开一个Observable来拦截单击事件。现在您可以完全控制您想要对单击事件做什么(,还记得RxJava操作符吗?)。

你为什么不试试呢?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32779956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档