Programing

ArrayAdapter에서 항목을 추가 / 제거 할 수없는 이유는 무엇입니까?

lottogame 2020. 12. 14. 07:42
반응형

ArrayAdapter에서 항목을 추가 / 제거 할 수없는 이유는 무엇입니까?


나는를 사용하고 ArrayAdapter<CharSequence>A의 목록에 항목을 채우는 데 android.widget.Spinner. 모두 잘 작동합니다.

하지만 이제는 항목 목록을 동적으로 유지하고 싶습니다. 즉, 런타임에 선택 목록에서 항목을 추가 / 제거 할 수 있기를 원합니다. 그러나 클래스 의 Javadocs 가이 두 가지 메서드를 정확히 의도 한 목적으로 사용할 수 있다고 설명 하더라도 호출 adapter.add(item)하거나 항상를 adapter.remove(item)얻습니다 .UnsupportedOperationExceptionArrayAdapter

이것이 실제로 구현되지 않은 버그입니까, 아니면 여기서 누락 된 것이 있습니까?


일반 Java 배열 (예 :)로 어댑터를 초기화했을 수 String[]있습니다. java.util.List인터페이스 를 구현하는 것을 사용해보십시오 (예 :) ArrayList<String>.


늦었다는 것을 알고 있지만 간단한 설명은 Arrays.asList (T ... array) 메서드 읽기 전용ArrayList 라는 사용자 지정 내부 클래스를 반환하기 때문 입니다. 이미 말했듯이 완전한 impl을 제공해야합니다. 예 : java.util.ArrayList.


다음은 소스 코드입니다 ArrayAdapter#remove.

public void remove(T object) {
    if (mOriginalValues != null) {
        synchronized (mLock) {
            mOriginalValues.remove(object);
        }
    } else {
        mObjects.remove(object);
    }
    if (mNotifyOnChange) notifyDataSetChanged();
}

UnsupportedOperationException거기에 던질 수있는 유일한 것은 else- 블록의 줄입니다. 따라서 문제는 사용중인 목록이 항목 제거를 지원하지 않는다는 것입니다. 내 생각 엔 배열을 사용하고 있습니다. 예를 들어 ArrayList를 사용해보십시오.

편집 : 네, 마크가 말한 것 ...


동일한 문제가 발생하여 데이터가 리소스 String Array에 저장되었으므로 createFromResource으로 ArraAdapter를 생성했습니다 .
리소스 String Array에서 ArrayAdapter를 만드는 다음 코드는 문제를 해결했습니다.

Resources res = getResources();
String[] cities = res.getStringArray(R.array.cities_array);
ArrayAdapter<CharSequence> adapter = new ArrayAdapter(
     this,
     android.R.layout.simple_spinner_item,
     new ArrayList(Arrays.asList(cities)));

어댑터 클래스에서-항목 삭제

remove(position);
notifyDataSetChanged();

항목 추가-

adapter.add (newItem);
adapter.notifyDataSetChanged ();

아마도 ArrayList 대신 ArrayAdapter 클래스 에서 List를 사용하고있을 것입니다 .

배열 또는 목록을 ArrayList 로 변환하십시오 -

new ArrayList<ClassType>(Arrays.asList(array));

참고 URL : https://stackoverflow.com/questions/3476723/why-cant-one-add-remove-items-from-an-arrayadapter

반응형