android - 如何将事件从一个 fragment 中的列表适配器发送到另一个 fragment ?

标签 android android-fragments interface

让我先展示我的应用程序的基本结构:

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

现在我有这样一种情况,在 SearchAdapter 中处理 ListView 中的按钮点击,这需要导致被点击的列表项的 ID 被传递到 WatchListFragment,这样我就可以将该项目添加到 ListView 中WatchListListViewFragment...

将内容直接从一个 fragment 传递到另一个 fragment 似乎是一种不好的做法,所以我想我应该尝试接口(interface),从 SearchAdapter -> SearchListViewFragment -> SearchFragment -> MainActivity -> WatchListFragment 传递 ID。不太清楚我在做什么,我最终得到了四个看起来几乎相同的界面。这对我来说似乎不对。所以现在我正在考虑尝试一个由所有相关类实现的单一接口(interface)。但这也感觉不太对...

是否有一些我应该使用的执行此操作的标准方法? “一机多用”是个好主意吗?我尝试阅读界面以获得一个想法,虽然我在简化的教科书示例中得到了这个想法,但这种情况完全是另一回事......

最佳答案

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



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

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...
    }
}       

关于android - 如何将事件从一个 fragment 中的列表适配器发送到另一个 fragment ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21922157/

相关文章:

android - 1.5 中的 OnClick 事件?

java - 使用 Sherlock ActionBar、Fragment Tab、ViewPager、PreferenceActivity

Android Viewpager如何动态移除一个Fragment?

c# - .NET 中 "equals"的内部结构

Java - 接口(interface)实现中的方法名称冲突

android - 从 Facebook 链接打开应用程序

android - Google Play 错误代码 "-504"

android - 如何将 AsyncTaskLoader 绑定(bind)到 Fragment 的生命周期?

java - 我们可以在java中实现接口(interface)内的任何方法吗

android - 没有 GPU 的 Android 手机上的 OpenGL ES 2.0?