2010-04-01 81 views
52

Ai đó có thể vui lòng cho tôi một mã ví dụ về việc xóa tất cả các mục ListView và thay thế bằng các mục mới?Xóa mục ListView trong Android

Tôi đã thử thay thế các mục bộ điều hợp mà không thành công. Mã của tôi là

populateList(){ 

results //populated arraylist with strings 

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

listview.setAdapter(adapter); 
adapter.notifyDataSetChanged(); 
listview.setOnItemClickListener(this); 

} 

// now populating list again 

repopulateList(){ 

results1 //populated arraylist with strings 

ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, results1); 

listview.setAdapter(adapter1); 
adapter1.notifyDataSetChanged(); 
listview.setOnItemClickListener(this); 
} 

Phương thức này sẽ thêm vào mục ListView, nhưng không xóa/thay thế tất cả các mục ListView.

Trả lời

20

Bạn có thể sử dụng

adapter.clear() 

rằng sẽ loại bỏ tất cả các mục của bộ chuyển đổi đầu tiên của bạn thì bạn có thể thiết lập một trong hai bộ chuyển đổi khác hoặc tái sử dụng các bộ chuyển đổi và thêm các mục cần adapter cũ. Nếu bạn sử dụng

adapter.add() 

thêm dữ liệu vào danh sách của bạn, bạn không cần phải gọi notifyDataSetChanged

+5

Không có() rõ ràng cho CustomAdapter của tôi mở rộng từ BaseAdapter! –

20

Tôi nghĩ rằng nếu u thêm đoạn mã sau, nó sẽ làm việc

listview.invalidateViews(); 

Để xóa một mục, Chỉ cần xóa mục đó khỏi danh sách mà chúng tôi đã chuyển đến bộ điều hợp và làm listview.invalidateViews();
Điều này sẽ làm mới danh sách xem

+0

Điều này làm việc tuyệt vời với tôi, cảm ơn! – bodruk

+0

Mã này hoạt động hoàn hảo! – Razor

+0

listview.invalidate() đã làm việc cho tôi. –

4
  names = db.getSites(); 
      la = new ArrayAdapter<String>(EditSiteList.this, 
        android.R.layout.simple_list_item_1, names); 
      EditSiteList.this.setListAdapter(la); 
      listview.invalidateViews(); 

mã này hoạt động tốt cho tôi.

64

Bạn sẽ muốn remove() mục từ đối tượng bộ điều hợp của mình và sau đó chỉ cần chạy notifyDatasetChanged() trên Bộ điều hợp, bất kỳ ListView sẽ (sẽ) tái chế và tự cập nhật.

Dưới đây là một ví dụ hoạt động ngắn với AlertDialog s:

adapter = new MyListAdapter(this); 
    lv = (ListView) findViewById(android.R.id.list); 
    lv.setAdapter(adapter); 
    lv.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> a, View v, int position, long id) { 
     AlertDialog.Builder adb=new AlertDialog.Builder(MyActivity.this); 
     adb.setTitle("Delete?"); 
     adb.setMessage("Are you sure you want to delete " + position); 
     final int positionToRemove = position; 
     adb.setNegativeButton("Cancel", null); 
     adb.setPositiveButton("Ok", new AlertDialog.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       MyDataObject.remove(positionToRemove); 
       adapter.notifyDataSetChanged(); 
      }}); 
     adb.show(); 
     } 
    }); 
+30

MyDataObject của bạn là gì? – draw

+7

MyDataObject sẽ là bất kỳ cửa hàng ủng hộ cuối cùng của bạn là gì. Hầu hết thời gian, bạn không chỉ muốn xóa các mục khỏi bị DISPLAYED, bạn cũng muốn xóa chúng khỏi một số cơ sở dữ liệu hoặc một số máy chủ hoặc một số lưu trữ tệp. Esharp chỉ để lại một lời nhắc nhở rằng bạn cần phải nhớ để thực sự xóa dữ liệu, ngoài việc loại bỏ nó khỏi màn hình. – Nate

9

Tháo cửa ra khỏi bộ chuyển đổi và sau đó thông báo cho arrayadapter bộ dữ liệu đã thay đổi.

m_adapter.remove(o); 
m_adapter.notifyDataSetChanged(); 
14
int count = adapter.getCount(); 
for (int i = 0; i < count; i++) { 
adapter.remove(adapter.getItem(i)); 
} 

sau đó gọi notifyDataSetChanged();

+7

Nên là 'adapter.remove (adapter.getItem (0));'? – Ishtar

+0

'adapter.remove (adapter.getItem (0));' điều này sẽ chỉ loại bỏ phần tử đầu tiên nhưng nếu bạn muốn loại bỏ tất cả chúng sau đó đi cho những gì tôi đã đăng .. – Rex

+4

Nhận xét của Ishtar là chính xác. Mã trên sẽ cố gắng xóa các mục ở cuối danh sách. Mỗi lần lặp qua danh sách loại bỏ một mục, vì vậy vào thời điểm tôi bằng (đếm - 1), bạn có một danh sách một mục và getItem (i) sẽ thất bại. –

4
  • Bạn chỉ nên sử dụng một bộ chuyển đổi binded với danh sách các dữ liệu bạn cần phải liệt kê
  • Khi bạn cần phải loại bỏ và thay thế tất cả các mục, bạn có để xóa tất cả các mục khỏi danh sách dữ liệu bằng cách sử dụng "list.clear()" và sau đó thêm dữ liệu mới bằng cách sử dụng "list.addAll (List)"

đây là ví dụ:

List<String> myList = new ArrayList<String>(); 
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,  android.R.layout.simple_list_item_1, myList); 
listview.setAdapter(adapter); 
listview.setOnItemClickListener(this); 

populateList(){ 
    List<String> result = getDataMethods(); 

    myList.addAll(result); 
    adapter.notifyDataSetChanged(); 
} 

repopulateList(){ 
    List<String> result = getDataMethods(); 

    myList.clear(); 
    myList.addAll(result); 
    adapter.notifyDataSetChanged(); 
} 
1

Lúc đầu, bạn nên xóa mục khỏi danh sách của mình. Sau đó, bạn có thể làm trống bộ điều hợp của mình và nạp nó với danh sách mới.

private void add(final List<Track> trackList) { 
    MyAdapter bindingData = new MyAdapter(MyActivity.this, trackList); 

    list = (ListView) findViewById(R.id.my_list); // TODO 

    list.setAdapter(bindingData); 


    // Click event for single list row 
    list.setOnItemClickListener(new OnItemClickListener() { 

     public void onItemClick(AdapterView<?> parent, View view, 
       final int position, long id) { 
      // ShowPlacePref(places, position); 
      AlertDialog.Builder showPlace = new AlertDialog.Builder(
        Favoriler.this); 
      showPlace.setMessage("Remove from list?"); 
      showPlace.setPositiveButton("DELETE", new OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) {  

        trackList.remove(position); //FIRST OF ALL REMOVE ITEM FROM LIST 
        list.setAdapter(null); // THEN EMPTY YOUR ADAPTER 

        add(trackList); // AT LAST REFILL YOUR LISTVIEW (Recursively) 

       } 

      }); 
      showPlace.setNegativeButton("CANCEL", new OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 

       } 
      }); 
      showPlace.show(); 
     } 

    }); 

} 
1

Thật đơn giản.Trước tiên, bạn nên xóa bộ sưu tập của bạn và sau khi danh sách rõ ràng như mã này:

yourCollection.clear(); 
setListAdapter(null); 
1

Bạn có thể sử dụng

lv.setAdapter(null); 
2

Hãy thử mã này, nó làm việc cho tôi.

public class Third extends ListActivity { 
private ArrayAdapter<String> adapter; 
private List<String> liste; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_third); 
    String[] values = new String[] { "Android", "iPhone", "WindowsMobile", 
       "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X", 
       "Linux", "OS/2" }; 
    liste = new ArrayList<String>(); 
    Collections.addAll(liste, values); 
    adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, liste); 
    setListAdapter(adapter); 
} 
@Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
    liste.remove(position); 
    adapter.notifyDataSetChanged(); 
    } 
} 
Các vấn đề liên quan