2016-06-23 88 views
1

我有持有三種不同的片段,列表視圖每個片段三個選項卡,它看起來像這樣:刷新ViewPager片段不能正常工作

enter image description here

當我按下白色按鈕列表項添加到tab2,如果我按下紫色按鈕列表項目被添加到tab3。 Tab3被刷新,因爲viewPager具有默認的屏幕外限制1,所以當我導航到tab3時,它被創建並且在那個時候它有新的listitem,但是tab2已經在應用程序啓動時被創建,因此我需要通過某種方法刷新它。所以我創建了tab2片段中的updateView()方法,並且我在OnPageChangeListener()方法上調用了它更新視圖的方法,但每次導航到tab2時都會調用它,並導致滯後。我想要做的就是刪除該列表項目並將其添加到tab2,它被刪除,它被添加到tab2,但是當我刷到tab2我看不到它,只是在關閉應用程序後它出現或當tab2片段調用onResume,onCreate ...

Async方法,其在加載背景列表項:在同一片段

public class AchievedDreamFragment extends Fragment { 

ListView achievedListView; 
Activity activity; 
ArrayList<AchievedCloud> achievedClouds; 


AchievedListAdapter achievedListAdapter; 
AchievedActionHandler achievedActionHandler; 

private GetAvedTask atask; 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
activity = getActivity(); 
achievedActionHandler = new AchievedActionHandler(activity); 

} 


public class GetAvedTask extends AsyncTask<Void, Void, <AchievedCloud>> { 

private final WeakReference<Activity> activityWeakRef; 


public GetAvedTask(Activity context) { 
    this.activityWeakRef = new WeakReference<Activity>(context); 
} 

@Override 
protected ArrayList<AchievedCloud> doInBackground(Void... arg0) { 
    Log.e(TAG,"do in background"); 
    //achievedActionHandler = new AchievedActionHandler(activity); 
    ArrayList<AchievedCloud> dreamList = achievedActionHandler.getaDreams(); 
    return dreamList; 
} 

@Override 
protected void onPostExecute(ArrayList<AchievedCloud> adrmList) { 
    Log.e(TAG,"on Post execute"); 
    if (activityWeakRef.get() != null 
      && !activityWeakRef.get().isFinishing()) { 
     achievedClouds = adrmList; 
     if (adrmList != null) { 
      if (adrmList.size() != 0) { 
       achievedListAdapter = new AchievedListAdapter(activity, 
         adrmList); 
       achievedListView.setAdapter(achievedListAdapter); 
       achievedListAdapter.notifyDataSetChanged(); 
      } 
     } 

    } 
} 
} 

的UpdateView()的方法,其中的AsyncTask是:

public void updateView() { 

    atask = new GetAvedTask(activity); 
    atask.execute((Void) null); 

} 

viewpager OnPageChangeListener():

@Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

    } 

    @Override 
    public void onPageSelected(int position) { 

     if(position == 1){ 
      achievedDreamFragment.updateView(); 

     } 
    } 

    @Override 
    public void onPageScrollStateChanged(int state) { 

    } 
}); 

我嘗試以及對適配器getItemPosition POSITION_NONE,但它並沒有解決這個問題的任何想法,我有什麼可以嘗試?

回答

0

我有這個相同的問題。我不確定這是否是最乾淨的方式,但它對我有用。

我創建了一個SharedPreferences變量。在onClick中添加Fragment中的列表項,我更新了SharedPreferences變量以「刷新」,並且還添加了一個Intent以返回到MainActivity。在onCreate中的MainActivity中,我檢查SharedPreferences varible的值。如果它等於「刷新」,我將該變量更新爲「」,並添加一個Intent以返回到原始片段。

0

您可以獲取tab2片段的實例。然後打電話給你的updateView()方法在該實例上直接:

Object anObject = viewPager.getAdapter().instantiateItem(viewPager, 1); 
// 1 is the Tab2; viewPager is the ViewPager in main activity 
if (anObject instanceof Tab2) { // Tab2 is your tab2's fragment 
    Tab2 tab2 = (Tab2) anObject; 
    tab2.updateView(); 
} 
0

對於這個問題,王「EventBus」的是完美的。

首先添加依賴關係: compile 'org.greenrobot:eventbus:3.0.0'在您的build.gradle文件中。欲瞭解更多信息請看這裏:EventBus

在TAB2添加這些方法:

` 
@Override 
public void onStart(){ 
    super.onStart(); 
    EventBus.getDefault().register(this); 
} 

@Override 
public void onStop(){ 
    EventBus.getDefault().unregister(this); 
    super.onStop(); 
} 
public void onEventItemAdded(EventAddItemTab2 event){ 
     loadItems(); // reload items from DB/Web using asynctask and set these items to the adapter 

} 

`

創建包名稱的新類,例如models,這個類: public class EventAddItemTab2{ // empty here }

然後在Tab1當你點擊白色按鈕時調用這個:

EventBus.getDefault().post(new EventAddItemTab2());

更多信息:當你呼叫.post方法的EventBus,這將自動調用onEventItemAdded方法在表2。您也可以將此模式用於Tab3。此解決方案非常適合需要分離邏輯的大型應用程序。 Tab1,Tab2和Tab3應該不知道彼此的存在。

0

遺憾地說,但你的要求是我也不清楚,但是從我知道如果你想用POSITION_NONE標誌來實現這一點,那麼你已經爲viewpager適配器調用了adapter.notifyDatasetChanged()。然後它將刷新所有的視圖,並且如果你在其中一個重寫的方法中調用了你的方法,它將得到已更新。所以你可以點擊按鈕來調用它。

0

我需要做的就是在我的tab2片段上調用此方法。每次看到片段時都會調用它!

@Override 
public void setMenuVisibility(boolean menuVisible) { 
    super.setMenuVisibility(menuVisible); 
    if(menuVisible){ 

     //load listview 
    } 
}