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

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

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

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

TIA...

【问题讨论】:

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

标签: android android-fragments fragment android-recyclerview rx-java


【解决方案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.从适配器调用接口方法

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

    【讨论】:

    • 虽然丑陋,但这是最好的答案。叹息。
    猜你喜欢
    • 1970-01-01
    • 2014-08-13
    • 2018-03-20
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    相关资源
    最近更新 更多