2010-11-16 108 views
89

當與陣列適配器關聯的數據更改時,使列表視圖失效足以顯示更新的值?以下代碼無法正常工作,我是否在這裏誤解了某些內容?適配器數據更改時更新列表視圖

public class ZeroItemListActivity extends Activity { 
    private ArrayList<String> listItems=new ArrayList<String>(); 
    private ListView mMyListView; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     mMyListView=(ListView) findViewById(R.id.MyListView); 
     mMyListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,listItems)); 
    } 
    public void addItem(View v){ 
     listItems.add("list Item"); 
     mMyListView.invalidate(); 
    } 
} 

佈局使用:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <TextView android:layout_width="fill_parent" 
     android:layout_height="wrap_content" android:text="@string/hello" /> 
    <ListView android:layout_width="wrap_content" 
     android:layout_height="wrap_content" android:id="@+id/MyListView"></ListView> 
    <Button android:layout_width="wrap_content" 
     android:layout_height="wrap_content" android:id="@+id/AddItemsButton" 
     android:text="Add Items" android:onClick="addItem"></Button> 
</LinearLayout> 

回答

149

替代:

mMyListView.invalidate(); 

爲:

((BaseAdapter) mMyListView.getAdapter()).notifyDataSetChanged(); 

如果不工作,請參閱此主題: Android List view refresh

+0

@blindstuff如果我有那麼我有什麼做的 – Developer 2013-08-21 05:48:36

+0

如果BaseAdapter不存在更新列表視圖中的單個項目,notifyDataSetChanged()不會顯示出來,所以你需要改變'BaseAdapter '到'YourCustomAdapter' – 2014-03-20 15:22:52

7

改變這一行:

mMyListView.setAdapter(new ArrayAdapter<String>(this, 
          android.R.layout.simple_list_item_1, 
          listItems)); 

到:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
            android.R.layout.simple_list_item_1, 
            listItems) 
mMyListView.setAdapter(adapter); 

和更新列表項的值後,致電:

adapter.notifyDataSetChanged(); 
4

invalidate();調用列表視圖無效本身(即。背景顏色)
invalidateViews();調用其所有子項失效。讓你更新孩子的意見

我認爲它的某些類型的效率的東西,防止所有的項目不斷必須重繪,如果沒有必要。

1

我發現了一個比當前接受的答案更有效的解決方案,因爲當前的答案會強制刷新所有列表元素。我的解決方案將通過調用適配器getView和回收當前視圖來刷新只有一個元素(被觸摸),這增加了更多的效率。

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // Edit object data that is represented in Viewat at list's "position" view = mAdapter.getView(position, view, parent); } });

相關問題