首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Viewholder通知RecyclerView适配器的最佳方法?

从Viewholder通知RecyclerView适配器的最佳方法?
EN

Stack Overflow用户
提问于 2017-04-16 04:28:43
回答 1查看 7.9K关注 0票数 7

我有一个具有多个项视图类型的RecyclerView,因此它们被分解为单独的ViewHolder类。以前,当所有ViewHolders都在RecyclerView适配器的同一个类中时,我可以在单击或删除项目时直接更新适配器。但是,为了更好地组织代码,我将ViewHolders划分为不同的类。现在,我不能直接更新我的RecyclerView适配器。以下哪种解决方案是从我的ViewHolder到我的适配器的最好的通信方式?如果有一个比我列出的更好的解决方案,请提出建议!

  1. 使用带有回调侦听器的接口。请记住,可能有5-10个不同的视图类型,所以这个方法需要5-10个接口吗?
    1. 使用Eventbus库,例如Greenrobot的Eventbus。

接口或事件总线解决方案真的是最好的方法吗?当然,在视图和适配器之间必须有一个更好的通信方法!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-16 07:05:05

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

代码语言:javascript
复制
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
    }
}

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

代码语言:javascript
复制
final MyAdapter adapter = new MyAdapter(new MyAdapter.MyInterface() {
    @Override
    public void someEvent() {
        adapter.notifyDataSetChanged();
    }
});
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43433706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档