6

似乎之前討論過刷新問題,但沒有解決方案爲我工作。使用FragmentStatePagerAdapter時刷新片段視圖

我在做什麼: 我正在使用FragmentStatePagerAdapter。適配器的每個位置都包含一個具有線性佈局的片段,該佈局具有象棋般的外觀,每個單元由一個CheckedTextView表示。

還有一個應監聽點擊並刪除單元格上的先前選擇並進行新選擇的偵聽器。

請告訴我工作: 每個片段的所有數據/默認狀態(而片段在列表加載計算)

正確加載當我點擊從保存的細胞列表中的所有狀態的細胞被正確提取,我可以在調試時看到代碼中的狀態改變。同時,我爲CheckedTextView分配了一個代表單元格的新狀態。這是設置,如:

的問題: 即使值存儲和分配正確的觀點不能被刷新,沒有更新的視圖中的單元格的值。

提示我已經試過未工作: 1.呼叫adapter.notifyDataSetChanged: 可謂是同時使用FragmentStatePagerAdapter只有當我們已經覆蓋:

@Override 
    public int getItemPosition(Object object){ 
     return POSITION_NONE; 
    } 

2.添加覆蓋DestroyItem的方法,並將片段添加到getItem上的Map上:

這是不合適的,因爲我正在處理FragmentStatePagerAdapter,所以使用這個pagerAdapter的全部目的將會消失。

3.調用無效: 這是不適合這種情況,我需要實時刷新。

4. instantiateItem()中的setTag()方法: 我不認爲這在這種情況下是合適的。

參考線: Refresh images on FragmentStatePagerAdapter on resuming activity

ViewPager PagerAdapter not updating the View

Update ViewPager dynamically?

notifyDataSetChanged fails to update ListView

我試圖說明我的問題儘可能講清楚,如果有人需要更多的澄清,不要問。

緊急答覆將高度讚賞,

乾杯

****更新*****

我使用,而不是默認的ViewPager ViewPagerIndicator。

+0

在你的設置中,每個片段代表什麼?它一次只能在屏幕上顯示一個片段嗎?你添加的代碼在哪裏?它在片段類中嗎?最後,什麼是GridRow? – 2013-03-04 09:48:22

+0

嗨謝里夫,每個片段代表一個國際象棋棋盤。我有一個調用容器片段的活動,這個containerFragment有一個viewpager,它具有FragmentStatePagerAadaper集合。每個適配器項目都是一個片段,並且在onCreatView的這個片段中,每個棋子視圖都被初始化。此外,單元的監聽器位於同一個片段中,我檢查當前狀態和新狀態並相應地更改狀態。 GridRow只是一行代表單元格的checkedTextview。我希望這回答你所有的問題,任何提示....? – AliR 2013-03-05 00:35:07

+0

事實上,一切都發生在你的片段內意味着所有這些麻煩都不需要。你確定你的選擇器(背景)是正確的嗎?你可以顯示它和你的XML每個單元格。通常情況下,當您試圖更新viewpager中的特定片段時,視圖不會更新。 – 2013-03-05 08:59:55

回答

0

關於notifyDataSetChanged()函數,我有兩種不同的體驗。

當我用我的ArrayAdapter的子類來更新ListView時,它的工作是筆直的。當我調用notifyDataSetChanged()時,ListView項目被更新。

但是,當我使用FragmentStatePagerAdapter的子類更新ViewPager時,調用notifyDataSetChanged()不起作用。 NotifyDataSetChanged()負責調用所有註冊的DataSetObserver的onChanged()函數,但觀察者沒有像ArrayAdapter中那樣自動註冊。你必須自己做地面工作。

令我驚訝的是,DataSetObserver不是一個接口,而是一個抽象類。所以我不能簡單地在我的子類的片段中實現它。我必須定義DataSetObserver的子類,然後在此類中定義一個成員字段作爲對我的片段的引用,並在覆蓋onChanged()函數中更新View顯示。代碼如下:

public class DetailFragDataSetObserver extends DataSetObserver { 
private DetailTextFragment view_instance; 
protected static ArrayList<DetailFragDataSetObserver> list = new ArrayList<DetailFragDataSetObserver>(); 

public DetailFragDataSetObserver(DetailTextFragment f){ 
    view_instance = f; 
    list.add(this); 
} 
public DetailTextFragment getView(){ 
    return view_instance; 
} 
public static DataSetObserver findDataSetObserverFor(DetailTextFragment f){ 
    for (int i = 0; i<list.size(); i++){ 
     if (list.get(i).getView() == f) 
      return list.get(i); 
    } 
    return null; 
} 
public static void release(DataSetObserver observer){ 
    list.remove(observer); 
    ((DetailFragDataSetObserver)observer).view_instance = null; 
} 
@Override 
public void onChanged(){ 
    assert null != view_instance; 

    view_instance.vUpdateData(); 
} 
} 

你必須要小心。您需要記住取消引用並在您的覆蓋fragment.onDestroy()中取消註冊DataSetObserver對象,否則無法收集碎片。

後來,通過查看源代碼,我發現ArrayAdapter和FragmentStatePagerAdapter並不是兄弟姐妹。他們完全不同。它們實際上來自不同的包裝:

android.widget.ArrayAdapter 
    android.support.v4.app.FragmentStatePagerAdapter 

這就是爲什麼前者很容易工作,而後者則不容易。