我的应用程序使用以下结构:

Activity > ViewPager > FragmentStatePagerAdapter > Fragment > RecyclerView


我过去一直很舒适地使用RecyclerViews,但是由于某些原因,当放置在Fragment中时,我无法让RecyclerView项注册点击事件。我的ViewHolder如下:

// 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.");
            }
        }

    }


任何帮助,将不胜感激。我尝试按照以下列出的步骤进行操作:https://guides.codepath.com/android/Creating-and-Using-Fragments#fragment-listener创建一个片段交互侦听器,但是我不确定如何从RecyclerView的适配器中实现它。提前致谢!

最佳答案

您应该在RecyclerView适配器的onBindViewHolder方法中而不是在ViewHolder中设置onClickListener。问题在于ViewHolders不是实际的视图(因此您不能单击一个视图),它们是绑定到视图的所有者,并允许您将这些视图重用于多个列表项以减少应用程序的内存占用。

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
    }
    .
    .
    .
}


确保将itemView的副本本地存储在视图持有者中,以便可以将OnClickListener绑定到列表项的容器。

RecyclerView.ViewHolder实现

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);
    }


}

我希望这有帮助!

-汤姆

关于android - 单击不适用于 fragment 内的RecyclerView项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40611576/

10-12 01:20
查看更多