仅供参考,我一直在尝试按照这个问题的答案
Basic Communication between two fragments
我在Fragments
ViewPager
内有Adapter
个Actionbar
。
我所拥有的是一个片段产生一些数据,这些数据可以(如果选择)插入到SQLite表中。
第二个Fragment
只显示表中的所有数据,但是我试图在Fragment
1将数据插入SQLite
表时进行一些通信。调用Fragment
2来刷新其选择查询(如再次执行查询)以自动显示最新数据。目前这是手动完成的按钮,我感觉不是很好。
这是interface
1
Fragment
onNumbersSavedListener mCallback;
public interface onNumbersSavedListener
{
public void RequestQueryRefresh();
}
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
try
{
mCallback = (onNumbersSavedListener) activity;
}
catch(ClassCastException e)
{
e.printStackTrace();
}
}
这是包含Activity
并实现ViewPager
interface
public class MainActivity extends FragmentActivity implements TabListener, GenerateFragment.onNumbersSavedListener
这是我遇到的主要问题,我没有片段的ID,上面链接中提到的答案就是这样。
@Override
public void RequestQueryRefresh() {
// TODO Auto-generated method stub
}
TLDR:我只是在寻找一种简单明了的方法,只要Fragment
1保存到数据库中,片段2就会通过重新运行查询来更新其列表视图。
答案 0 :(得分:2)
在此处查看有关otto lib的更多信息:http://square.github.io/otto/
<强>编辑:强>
public class FragmentA extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return super.onCreateView(inflater, container, savedInstanceState);
}
public void saveData(){
//save datas before
BusProvider.getInstance().post(new EventUpdateOtto());
}
}
public class EventUpdateOtto{
public EventUpdateOtto(){
}
}
public class FragmentB extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return super.onCreateView(inflater, container, savedInstanceState);
}
@Subscribe
public void subUpdateList(EventUpdateOtto mEventUpdateOtto){
//update yout list here
}
@Override
public void onResume() {
BusProvider.getInstance().register(this);
super.onResume();
}
@Override
public void onPause() {
BusProvider.getInstance().unregister(this);
super.onPause();
}
}
public class BusProvider {
private static final Bus BUS = new Bus();
public static Bus getInstance() {
return BUS;
}
private BusProvider() {
// No instances.
}
}
答案 1 :(得分:0)
在您的情况下,您可以改善界面:
public interface onNumbersSavedListener
{
public void RequestQueryRefresh(Bunde bundle/*or something other*/);
}
答案 2 :(得分:0)
如果您使用的是游标加载程序,则更改应自动反映在显示它的片段中。但是,每当表更改时想要立即更新的片段都可以注册为该表的观察者:
// observer to the table
class MyObserver extends ContentObserver {
final Handler mHandler;
public MyObserver(Handler handler) {
super(handler);
// I used a handler to get back to my UI thread
mHandler = handler;
}
@Override
public void onChange(boolean selfChange) {
this.onChange(selfChange, null);
}
@Override
public void onChange(boolean selfChange, Uri uri) {
Log.i(TAG, "MyObserver: onChange");
// do what you want to do - this is what I implemented
mHandler.post(myRunnable);
}
}
然后,注册它:
mHandler = new Handler();
mObserver = new MyObserver(mHandler);
ContentResolver resolver = getContext().getContentResolver();
resolver.registerContentObserver(uri, false, mEventLogObserver);
然后另一个片段应该发出通知:
getContext().getContentResolver().notifyChange(uri, null);
关键是uri - 一个人看着它,另一个人通知。