2015-04-16 82 views
0

一直在此卡住。Android - 將項目添加到片段更新中的列表視圖

我目前有3個片段,每個包含列表 - A | B | C(收藏夾)

A和B從在線檢索數據,C是離線收藏列表。

當用戶最喜歡A的東西時,它會立即顯示在收藏夾列表中,因爲ViewPageAdapter會從屏幕上加載另外一頁。所以A | B已經加載,這意味着當我去收藏夾(C)它必須重新加載。

我的問題是 - 當我在B中最喜歡的東西時,應用程序拒絕重新加載收藏夾(C),因爲當我點擊B時C已經被加載,唯一能看到我添加的東西是刷新應用程序。

我曾嘗試:

  • 更改setOffscreenPageLimit();爲0,所以它必須每次重新加載每個片段 - 即使笨重只是爲了看到它的工作,它仍然拒絕。

  • NotifyDataSetChanged也沒有工作,或者我不正確地理解它。

  • InstatiateItem在ViewPageAdapter,但不能得到那工作,找不到它的一個很好的例子來理解

  • 創建在喜歡代碼的新listadapter只是設法得到它加載新的數據 - 我可以在它被添加到收藏列表的日誌中看到,但它只是沒有被該ViewPageAdapter

  • 很多谷歌搜索的

什麼情況是,關於重載當用戶從B轉到C時,沒有新的代碼運行,因爲C的代碼全部運行,一旦我點擊B,它就直接進入C的列表。

我使用谷歌的SlidingTabLayout和SlidingTabStrip的碎片,一切正常,沒有任何改變。這裏找到 - https://developer.android.com/samples/SlidingTabsBasic/src/com.example.android.common/view/SlidingTabLayout.html

代碼:

public void favourite() 
{ 
    //if the user wants to favourite 
    ParseQuery<ParseObject> query = ParseQuery.getQuery("Favourite"); 
    //queries the id from the local data store in-case they have already favourited 
    query.whereEqualTo("id",id); 
    query.fromLocalDatastore(); 
    query.getFirstInBackground(new GetCallback<ParseObject>() { 
     public void done(ParseObject object, ParseException e) 
     { 
      if(object!=null) 
      { 
       Toast.makeText(getApplicationContext(),"You have already pinned this",Toast.LENGTH_SHORT).show(); 
      } 
      else 
      { 
       //otherwise create a new ParseObject and save the id,title and backdrop to 
       //the local datastore 
       final ParseObject favouriteShow = new ParseObject("FavouriteShow"); 
       favouriteShow.put("id", id); 
       favouriteShow.put("title", title); 
       favouriteShow.put("backdrop", backdropPath); 
       favouriteShow.pinInBackground(); 
       Toast.makeText(getApplicationContext(),"Pinned - "+ title,Toast.LENGTH_SHORT).show(); 
       //need to set favourite as null for it to redraw with the favourited icon 
       mFavourite.setImageDrawable(null); 
       mFavourite.setImageResource(R.drawable.favourited_already); 
      } 
     } 
    }); 
} 

ViewPagerAdapter:

public class ViewPagerAdapter extends FragmentStatePagerAdapter { 

CharSequence Titles[]; 
int tabNumber; 

public ViewPagerAdapter(FragmentManager fm, CharSequence[] mTitles, int mTabNumber) { 
    super(fm); 
    this.Titles = mTitles; 
    this.tabNumber = mTabNumber; 
} 

@Override 
public Fragment getItem(final int position) { 
    Fragment fragment = null; 
    switch (position) { 
     case 0: 
      fragment = new FragmentA(); 
      break; 
     case 1: 
      fragment = new FragmentB(); 
      break; 
     case 2: 
      fragment = new FavouritesFragmentC(); 
      break; 
    } 
    return fragment; 
} 

@Override 
public CharSequence getPageTitle(int position) { 
    return Titles[position]; 
} 

@Override 
public int getCount() { 
    return tabNumber; 
} 

}

非常感謝您的幫助。

亞當

回答

1

使用ViewPager.OnPageChangeListener和使用回調模式更新使用onPageSelected(位置)方法相應的 片段。

+0

這應該工作,@ AdamFirst –

+0

感謝您的。我一直在使用我的SlidingTabLayout中的onPageSelected,並使用簡單的if(位置== 2),當用戶滑過它時可以識別最喜歡的Fragment。認爲你是對的,這將是一條路。我的下一部分是實現回調。任何好的例子? –

+0

接受答案,如果你得到它的工作..接口回調將工作良好。 – suresh

0

我個人也有類似的問題。

此問題的解決方案取決於每個選項卡中顯示的數據是否與上下文相關。

如果不是,解決此問題的最佳方法實際上是更改應用程序的導航結構。因此,不要使用選項卡,而應使用導航抽屜。因此,每次用戶通過抽屜進入屏幕時,都會重新創建片段。通過這樣做,它將解決您的問題並改善用戶體驗。

如果是這樣,您可能需要創建爲基礎片段的所有選項卡的繼承,用函數調用刷新,那麼你可以要求適配器刷新所有標籤頁。這種方法很不方便,主要是因爲收藏夾部分不屬於選項卡。

+0

我明白你在說什麼,我已經考慮過了,通過操作欄中的按鈕或導航畫將用戶加入收藏夾,但應用程序的流程並不會很好,因爲內容全是有關。如果一切都失敗了,我會沿着這些路線實施一些東西,但這不是我的首選方法。 –

相關問題