ไม่สามารถแก้ไข ArrayAdapter ใน ListView: UnsupportedOperationException


97

ฉันกำลังพยายามสร้างรายชื่อที่มีรายชื่อ รายการนี้ควรแก้ไขได้ (เพิ่มลบจัดเรียง ฯลฯ ) อย่างไรก็ตามเมื่อใดก็ตามที่ฉันพยายามเปลี่ยนรายการใน ArrayAdapter โปรแกรมก็ขัดข้องพร้อมjava.lang.UnsupportedOperationExceptionข้อผิดพลาด นี่คือรหัสของฉัน:

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

ฉันลองใส่ลบและล้างวิธีการแล้วก็ไม่ได้ผล จะมีใครบอกฉันไหมว่าฉันทำอะไรผิด?

คำตอบ:


286

ฉันลองแล้วด้วยตัวเอง ... พบว่ามันไม่ได้ผล ดังนั้นฉันจึงตรวจสอบซอร์สโค้ดของArrayAdapterและพบปัญหา ArrayAdapter เมื่อถูกเริ่มต้นโดยอาร์เรย์จะแปลงอาร์เรย์เป็น AbstractList (รายการ) ซึ่งไม่สามารถแก้ไขได้

โซลูชัน ใช้ArrayList<String>แทนโดยใช้อาร์เรย์ในขณะที่เริ่มต้น 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); 

ไชโย!


8
ขอบคุณมาก! คุณช่วยฉันได้หลายชั่วโมงแห่งความหงุดหงิด คุณช่วยอธิบายให้ฉันฟังได้ไหมว่าทำไม String [] ไม่ทำงาน
Ryan

@Ryan คุณไม่สามารถแทรกลงในอาร์เรย์คุณสามารถเข้าไปในรายการได้เว้นแต่การใช้งานรายการจะไม่อนุญาต หากข้อมูลสำรองของคุณไม่เปลี่ยนแปลง ArrayAdapter จะช่วยให้คุณใช้เทคนิคที่มีประสิทธิภาพของหน่วยความจำมากขึ้น
Stephen Denne

@ st0le จะทำให้เกิดความแตกต่างอย่างไรถ้าฉันส่ง "ArrayList ใหม่ <String> (Arrays.asList (array))" หรือ "Arrays.asList (array)" ผลงานแรกและครั้งที่สองไม่ได้
golosovsky

1
@golosovsky ในวิธีแรกคุณสร้างรายการที่เปลี่ยนแปลงไม่ได้วิธีที่สองสร้างรายการที่ไม่เปลี่ยนรูป (ไม่สามารถแก้ไขได้เมื่อสร้างแล้ว)
st0le

3
มันเป็นปี 2016 และยังคงมีข้อยกเว้นที่ไร้สาระนี้เกิดขึ้นในสถานการณ์เฉพาะนี้
Eido95
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.