ListView에서 ArrayAdapter를 수정할 수 없음 : UnsupportedOperationException


95

이름이 포함 된 목록을 만들려고합니다. 이 목록은 수정 가능해야합니다 (추가, 삭제, 정렬 등). 그러나 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);
   }
});

삽입, 제거 및 지우기 방법을 시도했지만 아무도 작동하지 않았습니다. 누군가 내가 뭘 잘못했는지 말해 줄까요?

답변:


283

나는 그것을 시도했다, 나 자신 ... 그것이 작동하지 않는다는 것을 발견했다. 그래서 ArrayAdapter 의 소스 코드를 확인 하고 문제를 발견했습니다. ArrayAdapter는 배열에 의해 초기화 될 때 배열을 수정할 수없는 AbstractList (List)로 변환합니다.

솔루션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 2010

@ st0le "new ArrayList <String> (Arrays.asList (array))"또는 "Arrays.asList (array)"만 전달하면 어떤 차이가 있습니까? 첫 번째는 작동하고 두 번째는 작동하지 않습니다.
golosovsky

1
@golosovsky, 첫 번째에서는 변경 가능한 목록을 만들고 두 번째 방법은 변경 불가능한 목록을 만듭니다. (만든
후에는

3
2016 년이고 여전히이 특정 시나리오에서 발생하는이 말도 안되는 예외입니다.
Eido95
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.