一个recycleview的适配器满足多个页面不同item的list

本文介绍了一个具体的RecyclerView适配器实现案例,包括多种视图类型的处理、点击事件监听及数据绑定等关键步骤。

自我记录一下而已:

1.直接上代码:

public class SampleWordsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements View.OnClickListener {
    private LayoutInflater mLayoutInflater;
    private List<Words> mData;
    private List<String> mtitle;
    private OnItemClickListener mOnItemClickListener = null;
    View view;
    int mviewType;
    final int WORDS_ONE = 1;
    final int WORDS_TWO = 3;
    final int TWO = 2;

    /**
     * Method name : 构造方法
     * Specific description :用于将布局和数据引入绑定
     *@param   context Context
     *@param   data ArrayList<String>
     */
    public SampleWordsAdapter(Context context, List data,int viewType) {
        mLayoutInflater = LayoutInflater.from(context);
        mviewType = viewType;
        if(WORDS_ONE==viewType || WORDS_TWO==viewType) {
            mData = data;
            LogUtils.d("这是打印单词的");
        }else if(TWO==viewType){
            mtitle = data;
            LogUtils.d(mtitle.toString());
            LogUtils.d("打印数量"+mtitle.size());
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LogUtils.d("打印子类类型:"+viewType);
        if (WORDS_ONE==viewType) {
            LogUtils.d("这是绑定单词的list!");
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_words, parent, false);
            ItemViewHolder vh = new ItemViewHolder(view);
            //将创建的View注册点击事件
            view.setOnClickListener(this);
            return vh;
        }else if (TWO==viewType){
            LogUtils.d("这是绑定阅读的item!!!!!!!!!!!!!!");
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_reading_home, parent, false);
            TwoItemViewHolder vh = new TwoItemViewHolder(view);
            //将创建的View注册点击事件
            view.setOnClickListener(this);
            return vh;
        }else if (WORDS_TWO==viewType) {
            LogUtils.d("这是绑定生词本的item!!!!!!!!!!!!!!");
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_strage_words_two, parent, false);
            ThreeItemViewHolder vh = new ThreeItemViewHolder(view);
            //将创建的View注册点击事件
            view.setOnClickListener(this);
            return vh;
        }
            return null;
    }

    @Override
    public int getItemViewType(int position) {
        if(WORDS_ONE==mviewType){
            LogUtils.d("返回类型:"+WORDS_ONE);
            return WORDS_ONE;
        } else if (TWO==mviewType){
            LogUtils.d("返回类型:"+TWO);
            return TWO;
        }else if (WORDS_TWO==mviewType){
            LogUtils.d("返回类型:"+WORDS_TWO);
            return WORDS_TWO;
        }
        return 0;
    }

    //最后暴露给外面的调用者,定义一个设置Listener的方法():
    public void setOnItemClickListener(OnItemClickListener listener) {
        this.mOnItemClickListener = listener;
    }


    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if(holder instanceof ItemViewHolder){
            LogUtils.d("绑定单词的布局");
            ((ItemViewHolder)holder).setData(mData.get(position));
        }else if (holder instanceof TwoItemViewHolder){
            LogUtils.d("绑定其他的界面");
            ((TwoItemViewHolder)holder).setData(mtitle.get(position));
        }else if (holder instanceof ThreeItemViewHolder){
            LogUtils.d("绑定生词本界面");
            ((ThreeItemViewHolder)holder).setData(mData.get(position));
        }
        //将position保存在itemView的Tag中,以便点击时进行获取
        holder.itemView.setTag(position);
    }

    @Override
    public int getItemCount() {
        if (WORDS_ONE==mviewType || WORDS_TWO==mviewType) {
            return mData.size();
        }else{
            LogUtils.d("打印数量2"+mtitle.size());
            return mtitle.size();
        }
    }

    /**
     * Method name : onClick
     * Specific description :继承View.OnClickListener 接口,实现这个点击方法
     *@param    view
     *@return void
     */
    @Override
    public void onClick(View view) {
        if (mOnItemClickListener != null) {
            //注意这里使用getTag方法获取position
            mOnItemClickListener.onItemClick(view,(int)view.getTag());
        }
    }

    //define interface
    public static interface OnItemClickListener {
        void onItemClick(View view , int position);
    }
    public static class ItemViewHolder extends RecyclerView.ViewHolder {
        public View vBackground; // 背景
        public View vItem;
        public TextView tvItem; // 滑动的view
        public TextView tvSymbol;
        public TextView tvExplain;
//        public ImageView implay;
        public ImageView ivDone;
        public ImageView ivSchedule;

        public ItemViewHolder(View itemView) {
            super(itemView);
            vBackground = itemView.findViewById(R.id.rl_background);
            vItem = itemView.findViewById(R.id.ll_item);
            tvItem = (TextView) itemView.findViewById(R.id.tv_item);
            tvSymbol = (TextView) itemView.findViewById(R.id.tv_symbol);
            tvExplain = (TextView) itemView.findViewById(R.id.tv_explain);
//            implay = (ImageView) itemView.findViewById(R.id.tv_item);
            ivDone = (ImageView) itemView.findViewById(R.id.iv_done);
            ivSchedule = (ImageView) itemView.findViewById(R.id.iv_schedule);
        }

        //绑定数据
        public void setData(Words data){
            tvItem.setText(data.getWord());
            tvSymbol.setText(data.getSymbol());
            tvExplain.setText(data.getExplain());
//            tvExplain.setText("");
        }

    }

    public static class TwoItemViewHolder extends RecyclerView.ViewHolder {
        public TextView tv_reading_title;


        public TwoItemViewHolder(View itemView) {
            super(itemView);
            tv_reading_title = (TextView) itemView.findViewById(R.id.tv_reading_title);
        }
        //绑定数据
        public void setData(String title){
            LogUtils.d(title);
            tv_reading_title.setText(title);
        }

    }

    public static class ThreeItemViewHolder extends RecyclerView.ViewHolder {
        public TextView tv_word;
        public TextView tv_symbol;
        public TextView tv_explain;
        public ImageView im_delete;


        public ThreeItemViewHolder(View itemView) {
            super(itemView);
            tv_word = (TextView) itemView.findViewById(R.id.tv_word);
            tv_symbol = (TextView) itemView.findViewById(R.id.tv_symbol);
            tv_explain = (TextView) itemView.findViewById(R.id.tv_explain);
            im_delete = (ImageView) itemView.findViewById(R.id.im_delete);
        }
        //绑定数据
        public void setData(Words data){
            LogUtils.d(data.getWord());
            if (null == data) {
                LogUtils.d("生词列表:数据为空!!!");
            }else {
                //绑定数据
                LogUtils.d("打印生词本words:"+data.getWord());
                tv_word.setText(data.getWord());
                tv_symbol.setText(data.getSymbol());
                tv_explain.setText(data.getExplain());
            }
        }

    }
}

2.调用:(activity中)

 rvList = (RecyclerView) findViewById(R.id.rv_list);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        rvList.setLayoutManager(linearLayoutManager);
        mSampleWordsAdapter = new SampleWordsAdapter(this, mData,1);
        //获取数据重新回到列表
        mSampleWordsAdapter = new SampleWordsAdapter(this, getData(),1);
        rvList.setAdapter(mSampleWordsAdapter);
        //列表子项的点击监听
        mSampleWordsAdapter.setOnItemClickListener(getListen());

 

在 Android 开发中,两个 `RecyclerView` 是可以共用同一个 `Adapter` 实例的,但这种做法有一些限制和注意事项需要特别关注。 ### 共用 Adapter 的可行性 多个 `RecyclerView` 可以共享一个 `Adapter` 实例,前提是这些 `RecyclerView` 具有相同的布局结构、数据集以及绑定逻辑。由于 `Adapter` 负责管理数据与视图之间的映射关系,因此当多个 `RecyclerView` 使用相同的数据源和展示方式时,共享 `Adapter` 是可行的[^3]。 ### 实现方式 要实现两个 `RecyclerView` 共享同一个 `Adapter`,可以通过以下步骤进行: 1. 创建一个 `RecyclerView.Adapter` 子类,并定义其 `ViewHolder` 和数据绑定方法。 2. 在适配器中初始化数据源(如 `List`)并提供更新机制。 3. 将同一个适配器实例设置给两个或多个 `RecyclerView`。 示例代码如下: ```java // 定义 Adapter public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { private List<String> dataList; public MyAdapter(List<String> dataList) { this.dataList = dataList; } @NonNull @Override public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false); return new MyViewHolder(view); } @Override public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { holder.textView.setText(dataList.get(position)); } @Override public int getItemCount() { return dataList.size(); } static class MyViewHolder extends RecyclerView.ViewHolder { TextView textView; public MyViewHolder(@NonNull View itemView) { super(itemView); textView = itemView.findViewById(R.id.text_view); } } } // 在 Activity 或 Fragment 中使用 List<String> data = Arrays.asList("Item 1", "Item 2", "Item 3"); MyAdapter adapter = new MyAdapter(data); RecyclerView recyclerView1 = findViewById(R.id.recycler_view_1); RecyclerView recyclerView2 = findViewById(R.id.recycler_view_2); recyclerView1.setAdapter(adapter); recyclerView2.setAdapter(adapter); ``` ### 注意事项与限制 尽管共享 `Adapter` 是可能的,但在实际开发中需要注意以下几点: - **数据一致性**:如果两个 `RecyclerView` 需要显示不同数据子集或排序方式,则共享同一个 `Adapter` 会变得复杂,甚至不可行。 - **UI 更新同步**:当其中一个 `RecyclerView` 触发数据更新时,另一个 `RecyclerView` 也会受到影响,这可能导致不必要的 UI 刷新[^1]。 - **性能问题**:如果两个 `RecyclerView` 同时绑定到同一个 `Adapter`,可能会导致性能下降,尤其是在数据量较大的情况下。 - **布局差异**:如果两个 `RecyclerView` 使用了不同的 `LayoutManager`(例如一个是线性布局,另一个是网格布局),则共享 `Adapter` 可能会导致不一致的显示效果[^2]。 ### 总结 虽然技术上支持两个 `RecyclerView` 共享同一个 `Adapter`,但在实际应用中,是否采用这种方式取决于具体的业务需求和界面设计。如果两个 `RecyclerView` 的展示逻辑和数据完全一致,共享 `Adapter` 可以简化代码;否则,建议为每个 `RecyclerView` 单独创建适配器以避免潜在的问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值