Cập nhật chế độ xem danh sách khi dữ liệu bộ điều hợp thay đổi


104

Khi dữ liệu được liên kết với bộ điều hợp mảng bị thay đổi, việc vô hiệu hóa chế độ xem danh sách có đủ để hiển thị các giá trị được cập nhật không? Đoạn mã sau không hoạt động, tôi đã hiểu nhầm điều gì ở đây.?

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();
    }
}

Bố cục được sử dụng:

<?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>

Câu trả lời:


172

thay thế:

mMyListView.invalidate();

cho:

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

Nếu điều đó không hiệu quả, hãy tham khảo chuỗi này: Làm mới chế độ xem Danh sách Android


@blindstuff nếu tôi có để cập nhật các mặt hàng duy nhất của listview thì những gì tôi phải làm
Nhà phát triển

Nếu BaseAdapter không tồn tại, thông báoDataSetChanged () sẽ không hiển thị, vì vậy bạn cần phải thay đổi BaseAdapterthànhYourCustomAdapter
Junior Mayhé

12

Thay đổi dòng này:

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

đến:

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

và sau khi cập nhật giá trị của một mục danh sách, hãy gọi:

adapter.notifyDataSetChanged();

3

invalidate();gọi chế độ xem danh sách để tự làm mất hiệu lực (tức là màu nền)
invalidateViews();gọi tất cả các con của nó là vô hiệu. cho phép bạn cập nhật chế độ xem trẻ em

Tôi giả định rằng một số loại hiệu quả của nó ngăn chặn tất cả các mục liên tục phải được vẽ lại nếu không cần thiết.


2

Tôi đã tìm thấy một giải pháp hiệu quả hơn câu trả lời được chấp nhận hiện tại, vì câu trả lời hiện tại buộc tất cả các phần tử danh sách phải được làm mới. Giải pháp của tôi sẽ chỉ làm mới một phần tử (đã được chạm vào) bằng cách gọi bộ điều hợp getView và tái chế chế độ xem hiện tại, điều này thậm chí còn tăng thêm hiệu quả.

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);
    }
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.