2013-08-06 146 views
1

大家好,我是Android新手。我正在開發包含ListAdapter的應用程序,並且我想從onResume中清除它。onResume不更新適配器

在Activity中指的是levelsView。

public class MyActivity extends Activity{ 
        ... 


@Override 
    protected void onResume(){ 
     super.onResume(); 
     levelsView.onResume(); 
    } 
} 

LevelsView指FontsSelect在那裏我有myAdapter

public class FontsSelect extends LinearLayout { 
private List<FontLevels> fontsLevels; 

public FontsSelect(Context context, AttributeSet attr, int defStyle){ 
     super(context, attr, defStyle); 
     inflate(context, R.layout.list_view_of_fonts, this); 

     listViewFonts = (ListView)findViewById(R.id.list_of_fonts); 
     listViewFonts.setDivider(null); 
     fontsLevels = new ArrayList<FontLevels>(); 
     levels = new ArrayList<Level>(); 
     createLevels(); 
     myAdapter = new MyAdapter(context); 
     listViewFonts.setOnItemClickListener(levelSelectListener); 
     listViewFonts.setAdapter(myAdapter); 

    } 

public void createLevels(){ 
    ... 
fontsLevels.add(new FontLevels(context, "fonts/TNR.ttf"))} 

class MyAdapter extends BaseAdapter { 

     final LayoutInflater inflater; 

     public MyAdapter(Context context){ 
      inflater = LayoutInflater.from(context); 
     } 
     @Override 
     public int getCount() { 
      return fontsLevels.size(); 
     } 

     @Override 
     public Object getItem(int position) { 
      return fontsLevels.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      return position; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      final ViewHolder holder; 
      if(convertView == null){ 
       convertView = inflater.inflate(R.layout.item_level, parent, false); 
       holder = new ViewHolder((TextView)convertView.findViewById(R.id.level_name_typeface), (TextView)convertView.findViewById(R.id.level_score_number)); 
       convertView.setTag(holder); 
      } 
      else { 
       holder = (ViewHolder)convertView.getTag(); 
      } 

      ... 


      return convertView; 
     } 



    } 

public void onResume(){ 
     listViewFonts.setAdapter(null); 
     fontsLevels.clear(); 
     fontsLevels.add(new FontLevels(context, "fonts/TNR.ttf"); 
     fontsLevels.add(new FontLevels(context, "fonts/TNR.ttf"); 
     myAdapter = new MyAdapter(getContext(), fontsLevels); 
     listViewFonts.setAdapter(myAdapter); 
     myAdapter.notifyDataSetChanged(); 

    } 
} 

這裏是ckass FontLevel

public class FontLevels{ 
private String fontFullName; 
    private int _id; 
    private List<Level> easyLevels; 
    private List<Level> hardLevels; 

public FontLevels(Context context, String fontFullName){ 
     this.fontFullName = fontFullName; 
     typeface = Typeface.createFromAsset(context.getAssets(), FONTS_DIR + fontFullName); 
     easyLevels = new ArrayList<Level>(levelNumber); 
     hardLevels = new ArrayList<Level>(levelNumber); 
} 

,並重新啓動後,我的應用程序,適配器不更新,並顯示舊列表。 請幫忙)) Thanx !!!

+0

你確定你的數組列表正在當你重新啓動應用程序時更新?如果不是那麼它的一般行爲,以顯示舊值:) –

+0

我debuged應用程序,並看到,重新啓動後,構造函數初始化數組(''createLevels()')和'getCount()'返回正確的值,但然後'onResume '清除數組和'getCount()= 0',最後我不明白getCount()是否返回舊值,因爲沒有人初始化數組 – IgorB

+0

其實你已經定製了類並且隱藏了一些你的代碼無法獲取流和映射。你能用他們的參數和迴應發佈最少的方法嗎? –

回答

0

notifydatasetchanged()只有在使用修改底層數據的adapter.add()/adapter.clear()/adapter.remove()方法更新視圖結構由適配器提供。

如果您直接修改底層數據結構,則需要重新實例化傳遞新數據結構的適配器並重新設置視圖適配器。

我在我自己的代碼中發現了這個問題,並重新實例化了適配器修復了它。

- 更新 - 嘗試增加

myAdapter = new MyAdapter(); 
listViewFonts.setAdapter(myAdapter); 

到的onResume()來重新創建適配器的「新」的實例,並將其設置爲ListView

+0

謝謝,我會嘗試。但我有一個曲線estion,如果我添加按鈕並將其設置爲clickListener,其中'.clear()'我的數組,以及thren'adapter.notifydatasetchanged()'視圖將更改並且沒關係。但爲什麼不能從'onResume()'做同樣的事情。謝謝! – IgorB

+0

我會說實話,我不是100%肯定,但我認爲當你經歷的onPause在應用程序的編寫潛力被關閉,雖然內存不足,因此,當你回來到列表視圖對象範圍丟失onResume,該數組不再直接鏈接到陣列適配器對象。所以通知不起作用。同樣,一個猜測,我只能說是我觀察到相同的行爲,這是我固定它 – o0rebelious0o

+0

我能問你一個小忙,寫的你如何實現它的一個小例子。我會非常感謝你:) – IgorB

-1

下清除了ListView對我來說:

 listview.removeAllViewsInLayout(); 
     listview.removeAllViewsFromAdapter(); 
     listview.setAdapter(null); 
     listview.refreshDrawableState(); 
     listview.removeViews(0, listview.getChildCount()); 
+0

我加了它,但它不工作:( '@覆蓋 保護無效的onResume(){ super.onResume(); levelsView.fontsSelect.listViewFonts.removeAllViewsInLayout(); levelsView.fontsSelect.listViewFonts.setAdapter(NULL); levelsView.fontsSelect.listViewFonts.refreshDrawableState(); levelsView.fontsSelect.listViewFonts.removeViews(0,levelsView.fontsSelect.listViewFonts.getChildCount());} ' – IgorB

+0

手動清除視圖是不是做到這一點,適配器會檢測視圖被改變,並手動刷新自己,把它們直背 – o0rebelious0o

0

This post點出了問題,並描述了所有可能的解決方案