首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RecyclerView CardView onItemClick

RecyclerView CardView onItemClick
EN

Stack Overflow用户
提问于 2015-08-12 16:56:56
回答 1查看 2.7K关注 0票数 1

几天来一直困在这个问题上,希望能找到解决办法。

我无法将写在卡片上的数据(卡片视图)传递给下一个活动。

对于单击卡,我将在其onClickListner适配器中实现它的recyclerView。

我想传递的位置,卡点击,但由于卡视图不支持onItemClickListner,我面临的问题。

RecyclerViewAdapter类

代码语言:javascript
复制
public class RVAdapter extends recyclerView.Adapter<RVAdapter.PersonViewHolder> implements View.OnClickListener, View.OnLongClickListener {

 int position;
  @Override
public void onBindViewHolder(PersonViewHolder holder, int i) {
    setEventsForViews(holder, i);
}

private void setEventsForViews(PersonViewHolder holder, int i) {
    position = i;
    holder.cv.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    Navigator.toAddFriends(context, placeList.get(getPosition()).getPlaceId());
}

public static class PersonViewHolder extends RecyclerView.ViewHolder {
    CardView cv;

    PersonViewHolder(View itemView) {
        super(itemView);
        cv = (CardView) itemView.findViewById(R.id.cv);
    }

}

我试图设置一个变量位置,并试图传递它的值,但是由于对视图中的所有项调用onBindViewHolder是错误的,所以我最终将位置的值设置为最后一个。我知道这是错误的方法,但由于我是新的卡视图的东西,请建议我任何良好和干净的方式来做这件事。

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2015-08-12 17:24:52

创建一个新的接口,如:

代码语言:javascript
复制
public interface RecyclerViewClickListener {
public void recyclerViewListClicked(View v, int position);
}

在您的片段/活动中,实现新接口:

代码语言:javascript
复制
public class MyFragment extends BaseFragment implements RecyclerViewClickListener { }

现在,您将被迫在您的片段/活动上实现接口方法recyclerViewListClicked(View v, int position)。这样你就可以在点击一个项目时做你想做的任何事情。照这样做:

代码语言:javascript
复制
 @Override
public void recyclerViewListClicked(View v, int position) {
    myList.get(position);
}

现在让我们去看你的适配器。在适配器构造函数上,添加一个新的侦听器参数。它是类型的是我们刚刚创建的接口(不要忘记创建私有静态侦听器并在构造函数上设置它):

代码语言:javascript
复制
private static RecyclerViewClickListener mListener;

public myListAdapter(List<Thing> things, final Context context, RecyclerViewClickListener itemClickListener) {
    mThings = things;
    mContext = context;

    mListener = itemClickListener;
}

在适配器内部,在ViewHolder上,实现View.OnClickListener如下:

代码语言:javascript
复制
public static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener

您现在将被迫做@覆盖onClickMethod在您的ViewHolder。做:

代码语言:javascript
复制
    @Override
    public void onClick(View v) { }

在ViewHolder构造函数上,设置视图的onClickListener。比如:

代码语言:javascript
复制
public MyViewHolder(View view) {
        super(view);
        ButterKnife.bind(this, view);

        myCardViewLayout.setOnClickListener(this);
    }

现在将行为实现到您的ViewHolder onClickMethod。在这种情况下,我调用我们在适配器中声明的静态侦听器的recyclerViewListClicked方法。这个方法是我们的片段/活动中有@Overriden的方法,所以它需要position参数。

通过在视图持有者中调用getLayoutPosition()来获取该位置。它看起来是这样的:

代码语言:javascript
复制
    @Override
    public void onClick(View v) {
        mListener.recyclerViewListClicked(v, getLayoutPosition());
    }

最后,回到您的片段/活动,并使用this将侦听器传递给适配器构造函数(因为现在我们实现了接口RecyclerViewClickListener,它可以将自己作为侦听器传递给适配器):

代码语言:javascript
复制
mRecyclerView.setAdapter(new MyListAdapter(this.mList, this.getActivity(), this))

现在,当您单击列表项上的一个myCardViewLayout时,它将调用您的片段/活动的recyclerViewListClicked(View v, int position),并且您将能够使用您想要的位置参数。您可以对任何要从列表中获取单击事件的布局执行此操作。只需将myCardViewLayout.setOnClickListener(this)替换为ViewHolder构造函数中的myDesiredToHaveOnClickListenerLayout.setOnClickListener(this)即可。

希望这能有所帮助。

@编辑:

一些小贴士:

  • 从适配器中删除implements View.OnClickListener, View.OnLongClickListener
  • 看起来您不再需要在setEventsForViews(holder, i)上调用onBindViewHolder了。确认?

@UPDATE您的ViewHolder将是这样的:

代码语言:javascript
复制
public static class PersonViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    CardView cv;

    PersonViewHolder(View itemView) {
        super(itemView);
        cv = (CardView) itemView.findViewById(R.id.cv);

        cv.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        mListener.recyclerViewListClicked(v, getLayoutPosition());
    }

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

https://stackoverflow.com/questions/31971238

复制
相关文章

相似问题

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