如何在回收站视图中使用 OnClickListener? [复制]

Posted

技术标签:

【中文标题】如何在回收站视图中使用 OnClickListener? [复制]【英文标题】:How do you use an OnClickListener in a recycler view? [duplicate] 【发布时间】:2015-06-12 21:30:51 【问题描述】:

我基本上想要做的是使显示在回收器视图中的对象可点击到某个 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;
    


【问题讨论】:

在视图持有者内设置点击监听器。定义一个监听器接口并首先将其传递给Adapter,然后再传递给onCreateViewHolder 中的ViewHolder。处理点击实际上与ListView 完全相同。即使在RecyclerView 之前,您也不应该使用ListViewOnItemClickListener 回调,这就是RecyclerView 不再拥有它们的原因。 【参考方案1】:

Xaver Kapeller 在 cmets 中很好地总结了这个概念。如果您正在寻找一种简单的方法来管理您的 RecyclerView 交互,类似于 ListView 的传统交互,请查看 GitHub 上的 BigNerdRanch's recyclerview-multiselect 库。他们有一个您可以探索的示例应用程序,它实现了一系列OnClickListenersOnLongClickListeners,并增加了多选功能。

这是 BigNerdRanch 如何在 Fragment 中跨 AdapterViewHolder 实现侦听器的 sn-p,在这种情况下,它实际上是库自己的 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();
    

【讨论】:

以上是关于如何在回收站视图中使用 OnClickListener? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用分页库在回收站视图中添加日期分隔符?

如何在 jetpack compose 中使用改造 API 创建列表视图/网格视图/回收器视图

如何在回收站视图android中选择多个项目?

如何将按钮放在回收站视图的顶部?

如何在第一个活动中更新回收站视图,同时更改其他活动中的数据?

如何在回收站视图的 onBindViewHolder() 方法中调用 getString()?