Android 单击不处理片段内的RecyclerView项
我的应用程序使用以下结构:Android 单击不处理片段内的RecyclerView项,android,android-fragments,onclick,android-recyclerview,fragment,Android,Android Fragments,Onclick,Android Recyclerview,Fragment,我的应用程序使用以下结构: Activity > ViewPager > FragmentStatePagerAdapter > Fragment > RecyclerView 在过去,我一直使用RecyclerView,但由于某些原因,我无法让我的RecyclerView项目在放入片段时注册单击事件。我的取景器如下: // ViewHolder Class for ExhibitAdapter public class ViewHolder extends R
Activity > ViewPager > FragmentStatePagerAdapter > Fragment > RecyclerView
在过去,我一直使用RecyclerView,但由于某些原因,我无法让我的RecyclerView项目在放入片段时注册单击事件。我的取景器如下:
// ViewHolder Class for ExhibitAdapter
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView itemTitleTextView;
public TextView itemDescriptionTextView;
public NetworkImageView itemCoverPhoto;
public ViewHolder(View itemView) {
super(itemView);
itemCoverPhoto = (NetworkImageView) itemView.findViewById(R.id.exhibitThumbnailNIV);
itemTitleTextView = (TextView) itemView.findViewById(R.id.exhibitNameTV);
itemDescriptionTextView = (TextView) itemView.findViewById(R.id.exhibitDescriptionTV);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
try {
Log.d(TAG, "Exhibit clicked");
Exhibit currentExhibit = exhibits.get(getAdapterPosition());
intent.putExtra(ExhibitContentActivity.EXHIBIT_ID , currentExhibit.getId());
intent.putExtra(ExhibitContentActivity.EXHIBIT_COVER_URL , currentExhibit.getCoverPhotoUrl());
ActivityOptionsCompat options = ActivityOptionsCompat.
makeSceneTransitionAnimation((Activity) adapterContext, itemView.findViewById(R.id.exhibitThumbnailNIV), "profile");
Log.i(TAG, "Attempting to launch detail activity with exhibit id: " + currentExhibit.getId());
adapterContext.startActivity(intent, options.toBundle());
}
catch(IndexOutOfBoundsException e) {
Log.e(TAG, "* Error: Adapter position exceeded the no. of items.");
}
}
}
任何帮助都将不胜感激。我尝试按照中列出的步骤创建片段交互侦听器,但我不确定如何在RecyclerView的适配器中实现这一点。提前谢谢 您应该在RecyclerView适配器的onBindViewHolder方法中设置onClickListener,而不是在ViewHolder中。问题在于,视图持有者不是实际视图(因此您不能单击其中一个),它们是绑定到视图的持有者,允许您将这些视图重新用于多个列表项,以减少应用程序的内存占用 RecyclerView.Adapter实现
public MyAdapter extends RecyclerView.Adapter<YourViewHolderClass> {
.
.
.
@Override
public void onBindViewHolder(final YourViewHolderClass holder, int position) {
holder.itemView.setOnClickListener (new View.OnClickListener() {
@Override
public void onClick(View v) {
// Do something!
}
});
// Do you other view binding operations
}
.
.
.
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView itemTitleTextView;
public TextView itemDescriptionTextView;
public NetworkImageView itemCoverPhoto;
public View itemView;
public ViewHolder(View itemView) {
super(itemView);
this.itemView = itemView;
itemCoverPhoto = (NetworkImageView) itemView.findViewById(R.id.exhibitThumbnailNIV);
itemTitleTextView = (TextView) itemView.findViewById(R.id.exhibitNameTV);
itemDescriptionTextView = (TextView) itemView.findViewById(R.id.exhibitDescriptionTV);
}
}
我希望这有帮助
-Tom您的itemView中是否有任何可聚焦的视图?如果是这样,请尝试将android:focusable=“false”添加到视图的xml中,它在ListView中工作,但我不确定在RecyclerView中是否如此。谢谢Tom,但是我在onBindViewHolder中没有onClickListener的原因是,这样每次都会创建一个新的View.onClickListener,并且会失去使用RecyclerView的性能优势。ViewHolder只创建一次,因此标准做法是将onClickListener附加到它。这样,onBindView中的数据会根据需要进行更改,我们也可以使用onClick功能。问题是,当我在一个片段中时,我的点击将不起作用。所以我猜我的活动需要增加点击量。你找到解决办法了吗?@MichaelA。是的,问题只是1。我的项目布局花费了太长的时间来绘制和2。我在ViewHolder类中处理onClick逻辑。我通过在片段中创建一个监听器接口来解决这个问题,在ViewHolder的onClick中调用该监听器的onMyItemClick方法,然后在我的主活动中实现该监听器。这使我能够定义单击项目时要做什么,同时有效地将单击事件冒泡到我的主要活动中。@ShahraizT。您好,有您的解决方案的示例代码吗?我也有同样的问题,你的解决方案正是我所需要的。非常感谢。