BaseAdapter와 ArrayAdapter의 차이점은 무엇입니까?


100

사용 BaseAdapterArrayAdapter. 의 차이점을 알고 싶습니다 .

나는 내가 원하는 것을 성취하고있다 ArrayAdapters.

ListView구현 된 어댑터 인터페이스 의 성능에 영향을 줍니까 ?

그리고 마지막 질문은 ListView이것들 중 하나 를 사용하여 무엇을 Adapters할 수 있습니까? 아니면 특정 어댑터 만 사용할 수있는 특정 경우가 있습니까?


2
developer.android.com/reference/android/widget/... . ArrayAdpter. developer.android.com/reference/android/widget/BaseAdapter.html . BaseAdapter. ArrayAdapter와는 BaseAdapter의 구상 서브 클래스입니다
Raghunandan

5
단순히 ArrayAdapter가 이미 구성되어 있으므로 사용하기 만하면됩니다. 그러나 BaseAdapter는 구현을 제공해야하는보다 일반적인 어댑터입니다. (Adapter의 getView (), getcount () 등 메소드)
Pragnani

답변:


111

차이점은 다음과 같습니다.

  • BaseAdapter원하는 것을 거의 할 수있는 매우 일반적인 어댑터입니다. 그러나 작동하려면 좀 더 많은 코딩을해야합니다.
  • ArrayAdapter배열 또는 ArrayList의 데이터에 대해 잘 작동하는보다 완벽한 구현입니다 . 마찬가지로 CursorAdapter데이터가 Cursor. 이 두 가지 모두 BaseAdapter.

데이터가 일종의 특수 컬렉션에 있거나 ArrayAdapter제공 되는 기본 동작을 원하지 않는 경우 BaseAdapter필요한 유연성을 얻기 위해 확장 할 수 있습니다.

각각의 성능은 실제로 구현하거나 동작을 변경하는 방법에 따라 다릅니다. 핵심적으로 둘 중 하나가 똑같이 효과적 일 수 있습니다 (특히 an ArrayAdapter a라는 점을 고려 BaseAdapter).

어떤 어댑터로든 원하는 것을 거의 할 수 있지만 이것이 BaseAdapter추상적이므로 직접 사용할 수 없습니다.


2
제공하는 기본 동작 ArrayAdapter(@ tanis-7x에서 언급했듯이)은 TextView목록 항목 내에 1 개만있을 수 있으며 실제로 매우 제한된 동작입니다. 각 목록 항목에 여러 컨트롤이있는 경우 BaseAdapter및 작업을 직접 사용해야합니다 . 물론 당신은 여전히 사용할 수 ArrayAdapter있기 때문에, ArrayAdapterA는 BaseAdapter.
Felix

21

BaseAdapterArrayAdapter확장 하는 동안 추상 BaseAdapter입니다 (의 구체적인 구현입니다 BaseAdapter). 확장 ArrayAdapter하면의 모든 ArrayAdapter기능 이 상속 되고 구현을 재정의하면 ArrayAdapter동작을 수정할 수 있습니다. 확장하는 경우 BaseAdapterArrayAdapter가 이미 구현 한 모든 Abstract 메서드를 구현해야합니다.

또한 ListView의 성능에 영향을 미칩니 까?

아니 그렇지 않아.

그리고 마지막 질문은 이러한 어댑터를 사용하여 ListView로 무엇이든 할 수 있습니까? 아니면 특정 어댑터 만 사용할 수있는 특정 경우가 있습니까?

SDK의 구현이 귀하의 요구를 충족한다면이를 재정의하고 바퀴를 다시 발명해야하는 이유는 무엇입니까?

그들 사이의 가장 큰 차이점은 즉 BaseAdapter 동안 인스턴스화 할 수 없습니다 ArrayAdapter


9

3 가지 질문에 대한 답변 :

(1) Android 문서에 따르면 BaseAdapter 는 여러 어댑터 유형의 수퍼 클래스 일 뿐이며 그중 하나는 ArrayAdapter. BaseAdapter다른 목적에 맞는 여러 다른 어댑터가 파생 됩니다. 결과적으로 둘 사이의 효율성에는 차이가 있습니다. 다양한 하위 클래스를 사용하여 다른 함수 / 방법 집합에 액세스 할 수 있습니다.

(2) 효율성은 ArrayAdapter해당 클래스 내에서 수행하는 작업의 효율성, 즉 비트 맵 및 기타 데이터 처리에 따라 달라집니다.

(3) 아마도 ListView다른 종류의 어댑터를 사용하여 작업하는 방법을 알아낼 수 있지만, ArrayAdapter작동 하는 이유 는 일반적으로 대화 형 목록을 작성하는 것이므로 의미가 있기 때문입니다. 는 ArrayAdapte소요 Array통상, ArrayList그 다음에 대한 백업 정보를 생성하도록 처리하는, 개체 ListView. 그런 의미에서 ArrayList-> ArrayAdapter-> 설정 ListView은 논리적으로 의미가 있습니다.


7

BaseAdapter와 ArrayAdapters의 또 다른 차이점은 배열 어댑터를 확장하면 하위 클래스 생성자에서 슈퍼 클래스 생성자를 호출해야한다는 것입니다.

UserListAdapter extends ArrayAdapter<String>{

   List<String> UserList;
   Context context;

   public UserListAdapter(Context context, int resource,List<String> listUsers) {
     super(context, resource, listUsers);      /* Super class constructor is called */
     UserList = listUsers;
     this.context = context;
   }

}

그러나 BaseAdapter에 대한 수퍼 클래스는 없습니다. BaseAdapter는 다른 모든 어댑터에 대한 수퍼 클래스 역할을합니다.

UserListAdapter extends BaseAdapter{

   List<String> UserList;
   Context context;

   public UserListAdapter(Context context, int resource,List<String> listUsers) {
     /* No super class constructor */
     UserList = listUsers;
     this.context = context;
   }

}

그리고 ArrayAdapter와 같이 BaseAdapter에 지정된 DataType이 필요하지 않습니다. 예 : ArrayAdapter <String>
John

또한 사용해서는 안 List<T> UserList;확장하는 클래스에 ArrayAdapter<T>
Selvin

6
private static final String[] COUNTRIES = new String[]{
            "Afghanistan", "Angola", "Australia", "Bangladesh", "Belgium",
            "Bhutan", "Brazil", "Canada", "China", "Denmark"
    };

ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, COUNTRIES);
AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.countries_list);
textView.setAdapter(adapter);

여기서는 ArrayAdapter와 같은 BaseAdapter를 사용할 수 없습니다.


3

BaseAdapters는 더 최소화되고 사용자 정의 할 수 있습니다. ArrayAdapters는 s의 가장 일반적인 용도를 구현 ListAdapter하지만 때로는 충분하지 않습니다.

그러나 ArrayAdapters를 사용하면 거의 모든 것을 얻을 수 있습니다 . ArrayAdapter를 올바르게 사용하여 목록이 이미 작동중인 경우 BaseAdapter에서 얻을 수있는 것이 없습니다.

그러나 당신이 저장하는 경우 Context, Arrays또는 Lists당신의 ArrayAdapter와 구현에, 어쩌면 당신은 전환 할 것 BaseAdapter같은, ArrayAdapter이미 구현이있다.

어쨌든, 그렇게하는 경우 항상 해당 항목을 제거하고을 사용 getItem()하여 배열 항목 getCount()을 가져오고 배열의 크기를 가져오고 getContext()뷰를 확장 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.