从 recyclerview 的适配器访问父片段方法

Posted

技术标签:

【中文标题】从 recyclerview 的适配器访问父片段方法【英文标题】:Accessing parent fragments methods from recyclerview's adapter 【发布时间】:2016-03-31 04:35:07 【问题描述】:

大家好,我正在尝试从回收器视图适配器类访问片段的几个方法和变量(包含回收器视图)。最简单的方法是传递片段引用以及创建它的适配器。但我不认为传递创建适配器的完整适配器参考是一个好方法。

我在我的项目中使用 RxJava,并使用 PublishSubject 尝试了很多事情,比如在适配器中创建一个主题,调用它的 onNext 执行事件并在片段中订阅该主题,但它没有成功..

因此,任何好的方法都将受到高度赞赏。

TIA...

【问题讨论】:

通过创建一个片段可以实现的接口来使用委托模式怎么样?片段可以使用adapter.setDelegate(this) 之类的东西初始化适配器,并且在适当的时候,适配器可以调用委托上的方法,例如if (delegate != null) delegate.someMethod(); 不知道代理的事情,得去看看。此外,由于使用 rxjava,因此已停止使用接口进行通信。 谁能帮我做同样的事情? 【参考方案1】:

我建议在您的应用中引入EventBus - 应用不同组件之间非常优雅的通信方式。

然后它看起来像:

Fragment:

public class MyFragment extends Fragment 

    private EventBus eventBus = EventBus.getDefault();

    RecyclerViewAdapter viewAdapter;

    @Override
    public void onAttach(Context context) 
        super.onAttach(context);
        eventBus.register(this);
    

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 
        View rootView = inflater.inflate(R.layout.fragment_a, container, false);

        if (viewAdapter == null) 
            viewAdapter = new RecyclerViewAdapter(eventBus);
        

        RecyclerView recyclerView = (RecyclerView)rootView.findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        recyclerView.setAdapter(viewAdapter);

        return rootView;
    

    @SuppressWarnings("unused") // invoked by EventBus
    public void onEventMainThread(final DataRefreshedEvent event) 
        // Do something!
    

    @Override
    public void onDetach() 
        eventBus.unregister(this);
        super.onDetach();
    

Adapter:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> 

    EventBus eventBus;

    public RecyclerViewAdapter(EventBus eventBus) 
        this.eventBus = eventBus;
    

    void sentSomethingToFragment() 
        eventBus.post(new DataRefreshedEvent());
    

    .....

事件:public final class DataRefreshedEvent

只是一个注释 - 使用Dagger,它看起来会更好。

希望对你有帮助

【讨论】:

【参考方案2】:

我的建议是使用界面方法。 1.创建一个界面。 2. Fragment 应该实现该接口。 3. 将该接口引用传递给适配器。 4.从适配器调用接口方法

这样你就可以在片段和适配器之间进行通信。

【讨论】:

虽然丑陋,但这是最好的答案。叹息。

以上是关于从 recyclerview 的适配器访问父片段方法的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从回收器适配器发送到片段 |如何从 recyclerview 适配器调用片段函数

从RecyclerView适配器更新活动或片段的视图

将对象列表从片段传递到 recyclerView 适配器

从片段类中的对话框添加项目到recyclerview。

从片段中获取意图值后,我如何在 recyclerview 项目中实现单击

从 Fragment 中的适配器(recyclerview)获取所有项目