根据this Tutorial,我实施了Sliding Tabs。
ViewPager
拥有3 Fragments
。在第一个Fragment
中,我将项添加到sqlite表中。在这些表的第二个Fragment
项中列出了ListFragment
。
如何触发更新第二个视图以查看这些新添加的项目?我已经调用了第二个Fragment
的刷新函数,它在第二个Fragment
本身内正常工作,但不是我添加项目。
/* ListFragment */
@Override
public void refreshView() {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
mListAdapter.notifyDataSetChanged();
}
});
}
/* ListAdapter */
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
mItems.clear();
mItems = mItemDAO.getAllEntries();
}
getAllEntries()
运行正常。适配器也应该正常工作,因为当我以前使用旧的ActionBar
选项卡时就是这种情况。添加项目后,我刷到第二个Fragment
,我可以看到新添加的项目。
答案 0 :(得分:1)
<强>更新强>
获取所有条目后致电super.notifyDataSetChanged()
。
@Override
public void notifyDataSetChanged() {
mItems.clear();
mItems = mItemDAO.getAllEntries();
// Update the ListAdapter now that you have the new Items
super.notifyDataSetChanged();
}
这是有效的,因为您在获取新条目之前告诉适配器更新,必须在获取项目后完成。
另外,对于碎片:
无论您的实现细节如何,基于其他片段数据更新片段的流程如下:
FragmentA - &gt;通过界面通知家长活动 - &gt;更新FragmentB
首先,用户在片段A中添加项目,成功完成此项目后,添加到SQLite数据库使用接口通知父活动更新其片段B.
FragmentA
创建的内容:
public interface IDataBaseChanged{
void databaseUpdated(boolean updated);
}
家长活动必须implements IDataBaseChanged
在FragmentA
中创建一个可以回调父级
private IDataBaseChanged mCallback;
public void addItemToDB(Object itemToAdd){
// ... perform the operation which adds the Item then if this item
// is actually added successfully meaning you get the long representation
// of the newly added row id and its not -1, perform a callback
// Callback method to tell the Parent Activity data was added
mCallback.databaseUpdated(true);
}
确保在FragmentA中覆盖onAttach并将界面附加到Activity:
@Override
public void onAttach (Activity activity){
try{
mCallback = (IDataBaseChanged) activity;
}catch(ClassCastException ex){
Log.e("Interface", "Failed to implement interface in parent", ex);
}
}
并在父活动中:
// Initialize this in your ViewPager's Adapter...
private FragmentB fragmentB;
@Override
void databaseUpdated(boolen updated){
if(updated && fragmentB != null){
// call a public method in fragment B to requery the DB
fragmentB.updateUI();
}
}
FragmentB
中的方法:
public void updateUI(){
// ... Perform the work to requery DB and display its results
// in the UI
}