如何在Recycler View中使用OnClickListener?

10

我试图实现的基本目标是,使在回收视图中显示的对象可点击到特定的TextView ID,因为我正在制作一个程序,它会在列表中显示专辑封面及其标题。我需要能够单击回收视图创建的每个方框,并在单击时弹出一个TextView以显示其他信息(作者、发布日期、流行曲目等),然后有一个返回按钮(如果可能的话)返回到专辑列表。我已经看了几个小时,无法弄清楚如何使OnclickListener起作用。如果您知道如何做或有任何建议,我很乐意听取。谢谢!

package com.albumlist.albumlist;

import android.content.Context;
import android.content.Intent;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private AlbumData[] itemsData;

    public MyAdapter(AlbumData[] itemsData){
        this.itemsData = itemsData;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        private TextView txtViewTitle;
        private ImageView imgViewIcon;

        public ViewHolder(View itemLayoutView) {
            super(itemLayoutView);
            itemLayoutView.setOnClickListener(this);
            txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.album_title);
            imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.album_icon);
        }

        @Override
        public void onClick(View v) {

        }
    }

    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {

        View itemLayoutView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.data_layout, null);

        ViewHolder viewHolder = new ViewHolder(itemLayoutView);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int position) {

        viewHolder.txtViewTitle.setText(itemsData[position].getTitle());
        viewHolder.imgViewIcon.setImageResource(itemsData[position].getImageUrl());
    }

    @Override
    public int getItemCount() {
        return itemsData.length;
    }

}

1
在您的视图持有者内设置点击监听器。定义一个监听器接口,并首先将其传递到“Adapter”,然后在“onCreateViewHolder”中传递给“ViewHolder”。处理点击实际上与“ListView”完全相同。甚至在“RecyclerView”之前,您就不应该使用“ListView”的“OnItemClickListener”回调,这就是为什么“RecyclerView”现在根本没有它们的原因。 - Xaver Kapeller
1个回答

4
这段话的意思是:这个概念被Xaver Kapeller在评论中很好地总结了。如果你正在寻找一种简单的方法来管理你的RecyclerView交互,类似于ListView的传统交互方式,请查看GitHub上的BigNerdRanch's recyclerview-multiselect库。他们有一个示例应用程序,您可以探索,其中实现了一系列OnClickListeners和OnLongClickListeners,并具有多选功能。
以下是BigNerdRanch如何在Fragment中跨Adapter和ViewHolder实现监听器的片段,这种情况下实际上是该库自己SwappingHolder的扩展。
public CrimeHolder(View itemView) {
        super(itemView, mMultiSelector);

        mTitleTextView = (TextView) itemView.findViewById(R.id.crime_list_item_titleTextView);
        mDateTextView = (TextView) itemView.findViewById(R.id.crime_list_item_dateTextView);
        mSolvedCheckBox = (CheckBox) itemView.findViewById(R.id.crime_list_item_solvedCheckBox);
        itemView.setOnClickListener(this);
        itemView.setLongClickable(true);
        itemView.setOnLongClickListener(this);
    }

    public void bindCrime(Crime crime) {
        mCrime = crime;
        mTitleTextView.setText(crime.getTitle());
        mDateTextView.setText(crime.getDate().toString());
        mSolvedCheckBox.setChecked(crime.isSolved());
    }

    @Override
    public void onClick(View v) {

        if (mCrime == null) {
            return;
        }
        if (!mMultiSelector.tapSelection(this)) {
            selectCrime(mCrime);
        }

    }


    @Override
    public boolean onLongClick(View v) {

        ((AppCompatActivity) getActivity()).startSupportActionMode(mDeleteMode);
        mMultiSelector.setSelected(this, true);
        return true;
    }


}


private class CrimeAdapter extends RecyclerView.Adapter<CrimeHolder> {
    @Override
    public CrimeHolder onCreateViewHolder(ViewGroup parent, int pos) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_item_crime, parent, false);
        return new CrimeHolder(view);
    }

    @Override
    public void onBindViewHolder(CrimeHolder holder, int pos) {
        Crime crime = mCrimes.get(pos);
        holder.bindCrime(crime);
        Log.d(TAG, "binding crime" + crime + "at position" + pos);
    }

    @Override
    public int getItemCount() {
        return mCrimes.size();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接