如何将listadapter中的事件从一个片段发送到另一个片段?

时间:2014-02-20 23:40:23

标签: android android-fragments interface

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

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

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

将内容直接从一个片段传递到另一个片段似乎是不好的做法,所以我想我会尝试使用接口,从SearchAdapter传递ID - > SearchListViewFragment - > SearchFragment - > MainActivity - > WatchListFragment。我不知道自己在做什么,最终得到的四个界面看起来几乎一样。这对我来说似乎不对。所以现在我正在考虑尝试一个由所有相关类实现的单一接口。但那也不太合适......

我应该使用一些标准的方法吗? “一站式接口”是一个好主意吗?我尝试阅读接口以获得一个想法,虽然我在简化的教科书示例中得到了这个想法,但这个案例却是另一个混​​乱......

2 个答案:

答案 0 :(得分:2)

我认为在这种特定情况下的最佳解决方案是Mediator模式。我实际上是在与原始问题相关的应用程序的另一部分中实现它。 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...
    }
}       

答案 1 :(得分:0)

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

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

mySearchAdapter.setIdListener(getActivity())

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

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

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