问题描述
我使用RecyclerView
适配器在活动内显示数据,我想在活动内实现onClickListener
,目前,我照常在适配器内设置onClickListener
,效果很好.
I use RecyclerView
adapter to display data inside an activity, I want to implement onClickListener
inside the activity, currently, I am setting onClickListener
inside adapter as usual which works fine.
public void onBindViewHolder(MyHolder holder, final int position) {
final Listdata data = listdata.get(position);
holder.vname.setText(data.getName());
holder.vname.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(activity, "clicked on " +position, Toast.LENGTH_SHORT).show();
}
});
}
但是我想在活动中实现它,所以我有更大的控制权.这不符合我的目的.我认为这对我们很多人都是有用的.
However I want to implement it inside activity so I have greater control. This doesn't serve my purpose. I think it'll be useful for a lot of us.
推荐答案
您需要查看本教程在这里可以更好地了解如何实现所需的行为.
You need to check this tutorial here for better understanding on how you can achieve the behaviour that you want.
如果要处理活动中的onClickListener
,则需要基于带有接口的回调实现.将接口从活动传递到适配器,然后在单击某些项目时从适配器调用回调函数.
In case of handling the onClickListener
from your activity you need to work based on a callback implementation with an interface. Pass the interface from the activity to your adapter and then call the callback function from your adapter when some items are clicked.
这是本教程中的示例实现.
Here's a sample implementation from the tutorial.
让我们首先拥有该界面.
Let us first have the interface.
public interface OnItemClickListener {
void onItemClick(ContentItem item);
}
您需要修改适配器以将侦听器作为参数,如下所述.
You need to modify your adapter to take the listener as the parameter like the one stated below.
private final List<ContentItem> items;
private final OnItemClickListener listener;
public ContentAdapter(List<ContentItem> items, OnItemClickListener listener) {
this.items = items;
this.listener = listener;
}
现在在您的onBindViewHolder
方法中,设置点击监听器.
Now in your onBindViewHolder
method, set the click listener.
@Override public void onBindViewHolder(ViewHolder holder, int position) {
holder.bind(items.get(position), listener);
}
public void bind(final ContentItem item, final OnItemClickListener listener) {
...
itemView.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
listener.onItemClick(item);
}
});
}
现在在RecyclerView
中设置适配器.
Now setting the adapter in your RecyclerView
.
recycler.setAdapter(new ContentAdapter(items, new ContentAdapter.OnItemClickListener() {
@Override public void onItemClick(ContentItem item) {
Toast.makeText(getContext(), "Item Clicked", Toast.LENGTH_LONG).show();
}
}));
因此,整个适配器代码如下所示.
So the whole adapter code looks like the following.
public class ContentAdapter extends RecyclerView.Adapter<ContentAdapter.ViewHolder> {
public interface OnItemClickListener {
void onItemClick(ContentItem item);
}
private final List<ContentItem> items;
private final OnItemClickListener listener;
public ContentAdapter(List<ContentItem> items, OnItemClickListener listener) {
this.items = items;
this.listener = listener;
}
@Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_item, parent, false);
return new ViewHolder(v);
}
@Override public void onBindViewHolder(ViewHolder holder, int position) {
holder.bind(items.get(position), listener);
}
@Override public int getItemCount() {
return items.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
private TextView name;
private ImageView image;
public ViewHolder(View itemView) {
super(itemView);
name = (TextView) itemView.findViewById(R.id.name);
image = (ImageView) itemView.findViewById(R.id.image);
}
public void bind(final ContentItem item, final OnItemClickListener listener) {
name.setText(item.name);
Picasso.with(itemView.getContext()).load(item.imageUrl).into(image);
itemView.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
listener.onItemClick(item);
}
});
}
}
}
这篇关于RecyclerView OnClickListener(最佳实践方式)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!