更新SlidingTabs中的碎片

时间:2015-04-30 13:50:34

标签: android android-viewpager

根据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,我可以看到新添加的项目。

1 个答案:

答案 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

    }