如何构建此Fragment / RecyclerView

时间:2016-10-06 16:00:56

标签: android android-fragments android-activity android-recyclerview

我知道这有点像设计问题,但我确实有一些具体的问题。我试图理解如何处理这样的情况:

假设我有一个RecyclerViewFragment,它可以加载包含一堆Toy对象的RecyclerView。

在一种情况下:也许这个RecyclerViewFragment是主显示器上ViewPager的一部分。此RecyclerView上有一个FloatingActionButton添加按钮。单击+按钮,您可以将新玩具添加到列表中。或者您可以直接从列表中单击玩具,弹出带有编辑/删除按钮的浮动菜单,按Edit可以在DialogFragment中编辑玩具的详细信息,或者单击删除从RecyclerView中删除它。

在另一种情况下:现在我在应用程序的一个单独部分,我想选择要使用的玩具。所以我按下一个按钮,DialogFragment会出现一个ToyslerView of Toys。我可以点击玩具,它会被添加到我的购物车中。

好像我应该在两种情况下重复使用相同的RecyclerView代码,因为它们都涉及相同玩具的列表。唯一的区别是,在一种情况下,我可以添加玩具和编辑玩具细节,而在另一种情况下,没有添加按钮并且点击玩具做了不同的事情(添加到购物车而不是提出编辑/删除对话框)。

这是处理此问题的正确方法:

  1. 从片段到活动的通信:接口?让onAttach方法中的RecyclerViewFragment将我的设计的监听器分配给上下文。然后,当按下一行RecyclerView时,将触发回调。现在底层的Activity可以决定如何处理该按 - 在一种情况下显示编辑/删除对话框,在另一种情况下将玩具添加到购物车。无论哪种方式,点击项目都会将玩具发送给调用活动,以便它可以决定如何处理它。

  2. 从Activity到Fragment的通信:现在使用Add按钮的情况怎么样?这个Add按钮本身并不是RecyclerViewFragment的一部分,因此当我单击Add时,它会弹出详细信息对话框,我可以在其中提供玩具详细信息,然后按OK添加它。所以不知何故,我必须将这个新玩具转移到Fragment,将它添加到RecyclerView。我会做这样的事情:

    RecyclerViewFragment recyclerViewFragment = (RecyclerViewFragment ) getSupportFragmentManager().findFragmentByTag("TOY_RECYCLERVIEW");
    recyclerViewFragment.getNewToyAndRefreshList(newToy);
    
  3. 然后在RecyclerViewFragment中:

    public void getNewToyAndRefreshList(Toy newToy) {
        toyList.add(newToy);
        Collections.sort(toyList); //Toy has Comparable implemented, sort by name
        recyclerViewAdapter.notifyDataSetChanged();
    }
    

    我是否在正确的轨道上?有没有不同的方法来解决这种情况?

1 个答案:

答案 0 :(得分:1)

这肯定是一个设计问题,但恕我直言,这是一个非常具体的问题,我相信这是一个很好的问题(我回答的原因),但这也意味着其他问题开发人员可能有其他方法来解决问题。

1。这是一种完全公平和可接受的方法。您让片段成为简单的UI元素,让其他人(活动)实现点击行为。

对于这种方法,请记住仅针对接口编写代码。这意味着,不要将它投射到您的活动中。例如:

// do this
toyClickListener.onToyClicked(toy);

// don't do this
((MyActivity)getActivity()).onToyClicked(toy);

这样你就可以保留简单的UI元素"完全没有意识到谁在实施这种行为。

2。 IMO对于这种情况(特别是在RecyclerView.Adapter上),最好的办法是忘记用户界面,只关注数据。您实现此功能的具体方式因您的数据源而异。

但基本的想法是,你有一个数据仓库(数据库?),任何人使用那里的数据,应订阅对它的更改。

所以你覆盖RecyclerView.Adapter.registerAdapterDataObserverunregisterAdapterDataObserver添加订阅/监听器代码,就像这样:

@Override registerAdapterDataObserver(RecyclerView.AdapterDataObserver observer) {
   super.registerAdapterDataObserver(observer);
   db.subscribe(this, toyList);
}

@Override unregisterAdapterDataObserver(RecyclerView.AdapterDataObserver observer) {
   db.unsubscribe(this);
   super.unregisterAdapterDataObserver(observer);
}

@Override public void onDbDataUpdate(new Data comes here){
    update the data, and call .notifyDataSetChanged();
}

这样一旦单击FAB +然后单击对话框,新的玩具就会被添加到数据库中,并且适配器会自动获得"通知。

因此,如果此数据来自SQLite,您可以在光标registerContentObserver上调用它,如果它是RealmDB,您将使用addChangeListener,即使Android数据绑定库也有{{3} }}