RecyclerView:如何捕获 ImageView 上的 onClick?
Posted
技术标签:
【中文标题】RecyclerView:如何捕获 ImageView 上的 onClick?【英文标题】:RecyclerView: how to catch the onClick on an ImageView? 【发布时间】:2016-01-20 17:30:22 【问题描述】:我的 RecyclerView 的 CardViews 中有一个 ImageView。 我想捕捉 ImageView 上的 onClick,就像我已经对 ListView 所做的那样。所以,在 public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) 我尝试了:
myViewHolder.imageView.setClickable(true);
myViewHolder.imageView.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
Log.d("TEST", "Clicked");
但这完全被忽略了。以下代码正在运行:
myViewHolder.imageView.setImageResource(R.drawable.star_yellow);
我能做什么?
【问题讨论】:
您能否发布您的 xm 以及可能的 onBindViewHolder 和 ViewHolder 本身?我在 CardView 中有一个带有 ImageViews 的项目,并且 onClick 工作得很好。 ***.com/questions/28379302/… 如果这不起作用也发布您的布局 【参考方案1】:这是我在项目中所做的。
在您的项目中某处有一个接口类:
public interface RecyclerViewClickListener
void onRowClicked(int position);
void onViewClicked(View v, int position);
在您的 RecyclerView.Adapter 类中,将此接口作为字段添加并通过构造函数将其传递给适配器:
public class YourRecAdapter extends RecyclerView.Adapter<YourRecAdapter.SimpleViewHolder>
private RecyclerViewClickListener listener;
public YourRecAdapter(RecyclerViewClickListener listener)
this.listener = listener;
public static class SimpleViewHolder extends RecyclerView.ViewHolder
public SimpleViewHolder(View itemView, final RecyclerViewClickListener listener)
super(itemView);
// find view ids here
itemView.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
if(listener != null)
listener.onRowClicked(getAdapterPosition());
);
someViewholderView.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
if(listener != null)
listener.onViewClicked(v, getAdapterPosition());
);
在你的Activity/Fragment中实现接口:
public class YourFragment extends Fragment implements RecyclerViewClickListener
@Override
public void onViewClicked(View v, int position)
if(v.getId == R.id.yourDesiredView)
// Do your stuff here
@Override
public void onRowClicked(int position)
// Clicked entire row
【讨论】:
谢谢回复,但是onBindViewHolder方法中不能管理点击吗? 是的,只需将我所有的 .setOnClickListener(...) 内容移动到 onBindViewHolder() 方法即可。然后,您不必将侦听器传递给 ViewHolder 的构造函数。但是,我认为在 ViewHolder 中使用 onClick 方法效率更高,否则当您滚动列表时它们会一直重新创建。 在 MyFragment 中我要创建一个 RecyclerViewClickListener 类型的新对象并将其作为参数传递给 Adapter 构造函数? 是的,只需传递 'this' 作为参数,让您的 Fragment 实现接口。根据需要向适配器添加任何其他参数(数据、上下文等)。 嗨@Tomislav。我正在尝试这样做,你在这里解释,但我可以从我的片段中调用接口。我已经打开了一个关于这个的帖子(***.com/questions/38954507/…)你能看看有什么问题吗???【参考方案2】:在您的 Viewholder 类中,您可以设置 OnClickListener,但您需要另一个接口才能将 OnClick 寄存器传递回您的适配器(或您的预期目标所在的任何位置)。
【讨论】:
对不起。这取决于您尝试使用 OnClick 做什么。如果您正在执行可以在 ViewHolder 本身内部本地完成的操作(例如调整图像大小),则您不需要接口或任何其他将 OnClick 传递回适配器的方法。但是,如果您尝试保存移动到新活动或切换到 ViewHolder 没有引用的图像,您将需要 ViewHolder 引用的自定义侦听器(接口),然后拥有活动或适配器可以监听。 我需要在onBindViewHolder中进行操作以上是关于RecyclerView:如何捕获 ImageView 上的 onClick?的主要内容,如果未能解决你的问题,请参考以下文章
带有 CollapsingToolbarLayout 的 Android RecyclerView 平滑滚动问题
当我将 ImageView 添加到 CardView 或 Fragment 时,为啥我的应用程序会崩溃?
如何使用 RecyclerView.State 保存 RecyclerView 的滚动位置?