【问题标题】:How to send an event from a listadapter in one fragment to another fragment?如何将事件从一个片段中的列表适配器发送到另一个片段?
【发布时间】:2014-02-20 23:40:22
【问题描述】:

首先让我展示一下我的应用的基本结构:

                  MainActivity                    
                     |  |
         -------------  ------------                                  
         |                         |
   SearchFragment           WatchListFragment             
         |                         |                       
SearchListViewFragment   WatchListListViewFragment
         |                         |
   SearchAdapter             WatchListAdapter          

现在我遇到了这样一种情况,在 SearchAdapter 中处理了对列表视图中的按钮的单击,这需要将被单击列表项的 ID 传递给 WatchListFragment,以便我可以将该项目添加到的 ListView WatchListListViewFragment...

将东西直接从一个片段传递到另一个片段似乎是不好的做法,所以我想我会尝试使用接口,从 SearchAdapter -> SearchListViewFragment -> SearchFragment -> MainActivity -> WatchListFragment 传递 ID。不太清楚我在做什么,我最终得到了四个看起来几乎相同的界面。这对我来说似乎不正确。所以现在我正在考虑尝试一个由所有相关类实现的单一接口。但这感觉也不太对劲……

是否有一些我应该使用的标准方法? “一个接口为所有”是个好主意吗?我尝试阅读接口以获得一个想法,虽然我在简化的教科书示例中得到了这个想法,但这个案例完全是另一回事......

【问题讨论】:

  • 我最终使用了一个完全不同的解决方案。起初我打算让我的 WatchListAdapter 扩展 ArrayAdapter,但我意识到如果让它们都扩展 SimpleCursorAdapter 的公共子类,我可以重用 SearchAdapter(扩展 SimpleCursorAdapter)中的几乎所有代码。因此,在 SearchAdapter 中单击按钮会导致数据库向我的数据库中的 watchlist_table 添加一个条目。 WatchListAdapter 订阅我的数据库中的自定义 onChange-listener 并在 watchlist_table 中执行插入/更新/删除时收到通知。希望可以帮助别人!

标签: android android-fragments interface


【解决方案1】:

我认为在这种特定情况下最好的解决方案是中介者模式。我实际上已经在与原始问题相关的同一应用程序的另一部分中实现了它。上面 JustSoAmazing 的回答只得到从 SearchAdapter 到 MainActivity 的“消息”,但不是一直到预期的接收者,即 WatchListFragment。当然,人们总是可以在 MainActivity 中实现接口,将消息向下转发到 WatchListFragment。但是,这种解决方案更通用,任何实现 AppMediatorInterface 的类都可以使用它来发送任何消息,使其非常灵活。



首先,我们定义一个接口,任何希望订阅通知的类都必须实现该接口。

AppMediatorInterface.java

public interface AppMediatorInterface {

    public void onAppMediatorNotification(Object sender, Object data);

}



其次,我们定义了实际的中介类,我选择将其设为静态以使其在应用程序的任何位置都可以轻松使用。

AppMediator.java

public class AppMediator{
    protected static List<AppMediatorInterface> observers = new ArrayList<AppMediatorInterface>();

    public static void addObserver(AppMediatorInterface observer){
                observers.add( observer );
    }

    public static void removeObserver(Object observer){
        int pos = observers.indexOf(observer);

        if( pos>-1 )
            observers.remove(pos);
    }

    public static void notifyObservers(Object sender, Object data){
        for( int i=0; i<observers.size(); i++ ){
            observers.get(i)).onAppMediatorNotification(sender, data);
        }
    }

}



发送通知:

SearchAdapter.java

AppMediator.notifyObservers( this, "Add-button clicked" );



收到通知:

WatchListFragment.java

public class WatchListFragment extends Fragment implements AppMediatorInterface{

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);                
        AppMediator.addObserver(this);
    }


    @Override
    public void onDestroy() {       
        AppMediator.removeObserver(this);
        super.onDestroy();
    }


    /* --- AppMediatorInterface --- */
    @Override
    public void onAppMediatorNotification(Object sender, Object data) {
        // Do something...
    }
}       

【讨论】:

  • 感谢您分享此解决方案。它真的很有帮助。 @BadCash
【解决方案2】:

只有一个界面才是王道。您可以在处理片段时执行以下操作,而不是在所有涉及的类中实现它并传递侦听器引用。

在您的 SearchAdapter 类中创建一个公共的静态接口,并让您的主要活动实现它。然后,在您的 SearchListViewFragment 类中,按如下方式设置回调:

mySearchAdapter.setIdListener(getActivity())

因为活动实现了接口并且片段可以访问活动,所以这是一个完全有效的声明。但是,如果 Activity 未在接口中实现,您将收到 ClassCastException。

或者,您可以只使用一系列 getter 方法,让您可以从主 Activity 访问搜索适配器,并让您设置回调。

例如,在您的 MainActivity 类中:getSearchFragment().getSearchListViewFragment().getSearchAdapter().setIdListener(this)

【讨论】:

    猜你喜欢
    • 2020-02-20
    • 1970-01-01
    • 2019-10-29
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多