几天来一直困在这个问题上,希望能找到解决办法。
我无法将写在卡片上的数据(卡片视图)传递给下一个活动。
对于单击卡,我将在其onClickListner适配器中实现它的recyclerView。
我想传递的位置,卡点击,但由于卡视图不支持onItemClickListner,我面临的问题。
RecyclerViewAdapter类
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是错误的,所以我最终将位置的值设置为最后一个。我知道这是错误的方法,但由于我是新的卡视图的东西,请建议我任何良好和干净的方式来做这件事。
提前谢谢。
发布于 2015-08-12 17:24:52
创建一个新的接口,如:
public interface RecyclerViewClickListener {
public void recyclerViewListClicked(View v, int position);
}在您的片段/活动中,实现新接口:
public class MyFragment extends BaseFragment implements RecyclerViewClickListener { }现在,您将被迫在您的片段/活动上实现接口方法recyclerViewListClicked(View v, int position)。这样你就可以在点击一个项目时做你想做的任何事情。照这样做:
@Override
public void recyclerViewListClicked(View v, int position) {
myList.get(position);
}现在让我们去看你的适配器。在适配器构造函数上,添加一个新的侦听器参数。它是类型的是我们刚刚创建的接口(不要忘记创建私有静态侦听器并在构造函数上设置它):
private static RecyclerViewClickListener mListener;
public myListAdapter(List<Thing> things, final Context context, RecyclerViewClickListener itemClickListener) {
mThings = things;
mContext = context;
mListener = itemClickListener;
}在适配器内部,在ViewHolder上,实现View.OnClickListener如下:
public static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener您现在将被迫做@覆盖onClickMethod在您的ViewHolder。做:
@Override
public void onClick(View v) { }在ViewHolder构造函数上,设置视图的onClickListener。比如:
public MyViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);
myCardViewLayout.setOnClickListener(this);
}现在将行为实现到您的ViewHolder onClickMethod。在这种情况下,我调用我们在适配器中声明的静态侦听器的recyclerViewListClicked方法。这个方法是我们的片段/活动中有@Overriden的方法,所以它需要position参数。
通过在视图持有者中调用getLayoutPosition()来获取该位置。它看起来是这样的:
@Override
public void onClick(View v) {
mListener.recyclerViewListClicked(v, getLayoutPosition());
}最后,回到您的片段/活动,并使用this将侦听器传递给适配器构造函数(因为现在我们实现了接口RecyclerViewClickListener,它可以将自己作为侦听器传递给适配器):
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将是这样的:
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());
}
}https://stackoverflow.com/questions/31971238
复制相似问题