ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android – 从Viewholder通知RecyclerView Adapter的最佳方法?

2019-07-27 08:35:47  阅读:512  来源: 互联网

标签:android-viewholder android android-recyclerview


我有一个带有多个项目视图类型的RecyclerView,因此它们被分成单独的ViewHolder类.之前,当所有ViewHolder与RecyclerView Adapter位于同一类时,我可以在单击或删除项目时直接更新适配器.但是,我将ViewHolders分成不同的类以更好地组织代码.现在,我无法直接更新我的RecyclerView适配器.以下哪种解决方案是从ViewHolder与我的适配器进行通信的最佳方式?如果有比我列出的更好的解决方案,请建议!

>使用具有回调侦听器的接口.请记住,可能有5-10种不同的视图类型,因此这种方法需要5-10个接口?

>使用Eventbus库,如Greenrobot的Eventbus.

接口或事件总线解决方案真的是最好的方法吗?肯定有一种更好的方法来进行视图和适配器之间的通信!

解决方法:

我通常在活动或片段中保存对适配器的引用. ViewHolders可以作为内部类放在Adapter中,也可以放在单独的包中.您可以使用一个界面与视图持有者进行交互.您只需在活动或片段中实现它.例如:

public class MyAdapter extends RecyclerView.Adapter<VH> {
    private MyInterface mInterface;

    public MyAdapter(MyInterface i) {
         mInterface = i;
    }

    //... some code to create view holders


    //binding
    @Override
    protected void onBindItemViewHolder(ViewHolder viewHolder, final int position, int type) {
        viewHolder.bindView(position, mInterface); //call methods of interface in bindView() methods of your viewHolders
    }

    interface MyInterface {
        void someEvent();
    }
}

public class ViewHolder extends RecyclerView.ViewHolder {

    TextView mText;

    ViewHolder(View root) {
        super(root);
        mText = (TextView)root.findViewById(R.id.text)
    }

    void bindView(int pos, MyAdapter.MyInterface myInterface) {
        mText.setOnClickListener(v -> myInterface.someEvent());
        //...some other code
    }
}

在你的活动或片段中的某个地方:

final MyAdapter adapter = new MyAdapter(new MyAdapter.MyInterface() {
    @Override
    public void someEvent() {
        adapter.notifyDataSetChanged();
    }
});

标签:android-viewholder,android,android-recyclerview
来源: https://codeday.me/bug/20190727/1552284.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有