首先让我展示我的应用程序的基本结构:
MainActivity
| |
------------- ------------
| |
SearchFragment WatchListFragment
| |
SearchListViewFragment WatchListListViewFragment
| |
SearchAdapter WatchListAdapter
现在我有一种情况,在SearchAdapter中处理listview中的按钮,这需要导致被点击的listitem的ID传递给WatchListFragment,所以我可以将该项添加到ListView WatchListListViewFragment ...
将内容直接从一个片段传递到另一个片段似乎是不好的做法,所以我想我会尝试使用接口,从SearchAdapter传递ID - > SearchListViewFragment - > SearchFragment - > MainActivity - > WatchListFragment。我不知道自己在做什么,最终得到的四个界面看起来几乎一样。这对我来说似乎不对。所以现在我正在考虑尝试一个由所有相关类实现的单一接口。但那也不太合适......
我应该使用一些标准的方法吗? “一站式接口”是一个好主意吗?我尝试阅读接口以获得一个想法,虽然我在简化的教科书示例中得到了这个想法,但这个案例却是另一个混乱......
答案 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)