与ListView不同的是,Android RecyclerView的实现似乎太复杂了。由于没有用于OnItemClickListener子级的RecyclerView,所以我一直试图实现以下操作来注册单击事件:
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));
}
});由于某些原因,我无法让这段代码正常工作。单击事件根本没有注册!有人能告诉我我做错了什么吗?我已经看到了一些解决方案,但我认为这应该是可行的。谢谢你的帮忙!
发布于 2015-09-25 10:47:50
而不是为整个RecyclerView设置onclicklistener,而是在Adapter.类的构造函数中设置它
一些示例代码将类似于下面的类,它是回收视图适配器中的一个内部类。
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的构造函数,
@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;
} 发布于 2016-06-15 21:52:59
虽然已经有了一些答案,但我想我也可以给我的实现提供一个解释。(详细信息可在我回答了另一个类似的问题上找到)。
因此,要添加单击侦听器,您的内部ViewHolder类需要实现View.OnClickListener。这是因为您将将OnClickListener设置为ViewHolder的构造函数的itemView参数。
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方法:
private OnEntryClickListener mOnEntryClickListener;
public interface OnEntryClickListener {
void onEntryClick(View view, int position);
}
public void setOnEntryClickListener(OnEntryClickListener onEntryClickListener) {
mOnEntryClickListener = onEntryClickListener;
}因此,您的新的、支持单击的Adapter已经完成。
现在,让我们用它..。
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的工作原理。
发布于 2016-08-16 08:44:32
似乎您已经得到了问题的答案,但是这里没有一个答案试图使用RxJava来解决这个问题。
我本人是RxJava的忠实粉丝,我从不错过任何可能使用它的机会。
我用的是这个,
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操作符吗?)。
你为什么不试试呢?
https://stackoverflow.com/questions/32779956
复制相似问题