Không thể sửa đổi ArrayAdapter trong ListView: UnsupportedOperationException


94

Tôi đang cố tạo một danh sách có chứa tên. Danh sách này phải có thể sửa đổi (thêm, xóa, sắp xếp, v.v.). Tuy nhiên, bất cứ khi nào tôi cố gắng thay đổi các mục trong ArrayAdapter, chương trình bị java.lang.UnsupportedOperationExceptionlỗi , có lỗi. Đây là mã của tôi:

ListView panel = (ListView) findViewById(R.id.panel);
String[] array = {"a","b","c","d","e","f","g"};
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, array);
adapter.setNotifyOnChange(true);
panel.setAdapter(adapter);

Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
      adapter.insert("h", 7);
   }
});

Tôi đã thử các phương pháp insert, remove và clear và không có phương pháp nào hoạt động. Ai đó sẽ cho tôi biết tôi đã làm gì sai?

Câu trả lời:


282

Tôi đã thử nó, bản thân mình ... Thấy nó không hoạt động. Vì vậy, tôi kiểm tra mã nguồn của ArrayAdapter và phát hiện ra vấn đề. ArrayAdapter, khi được khởi tạo bởi một mảng, chuyển đổi mảng thành một danh sách AbstractList (Danh sách) mà không thể sửa đổi.

Giải pháp Sử dụng ArrayList<String>thay thế bằng cách sử dụng một mảng trong khi khởi tạo ArrayAdapter.

String[] array = {"a","b","c","d","e","f","g"}; 
ArrayList<String> lst = new ArrayList<String>(Arrays.asList(array));
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
android.R.layout.simple_list_item_1, lst); 

Chúc mừng!


8
Cảm ơn bạn rất nhiều! Bạn đã tiết kiệm cho tôi hàng giờ thất vọng. Bạn có vui lòng giải thích cho tôi lý do tại sao Chuỗi [] không hoạt động không?
Ryan

@Ryan bạn không thể chèn vào mảng, bạn có thể vào danh sách, trừ khi việc triển khai danh sách không cho phép. Nếu dữ liệu sao lưu của bạn không thay đổi, ArrayAdapter cho phép bạn sử dụng kỹ thuật hiệu quả hơn về bộ nhớ.
Stephen Denne,

@ st0le có gì khác biệt nếu tôi chuyển "ArrayList mới <Chuỗi> (Arrays.asList (mảng))" hoặc chỉ "Arrays.asList (mảng)"? Cái đầu tiên hoạt động và cái thứ hai thì không.
golosovsky

1
@golosovsky, Trong cách đầu tiên, bạn tạo Danh sách có thể thay đổi, cách thứ hai tạo Danh sách bất biến. (không thể sửa đổi sau khi được tạo)
st0le

3
Đó là năm 2016 và vẫn là trường hợp ngoại lệ nực cười này được đưa ra ở kịch bản cụ thể này.
Eido95,
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.