사용 BaseAdapter
과 ArrayAdapter
. 의 차이점을 알고 싶습니다 .
나는 내가 원하는 것을 성취하고있다 ArrayAdapters
.
ListView
구현 된 어댑터 인터페이스 의 성능에 영향을 줍니까 ?
그리고 마지막 질문은 ListView
이것들 중 하나 를 사용하여 무엇을 Adapters
할 수 있습니까? 아니면 특정 어댑터 만 사용할 수있는 특정 경우가 있습니까?
사용 BaseAdapter
과 ArrayAdapter
. 의 차이점을 알고 싶습니다 .
나는 내가 원하는 것을 성취하고있다 ArrayAdapters
.
ListView
구현 된 어댑터 인터페이스 의 성능에 영향을 줍니까 ?
그리고 마지막 질문은 ListView
이것들 중 하나 를 사용하여 무엇을 Adapters
할 수 있습니까? 아니면 특정 어댑터 만 사용할 수있는 특정 경우가 있습니까?
답변:
차이점은 다음과 같습니다.
BaseAdapter
원하는 것을 거의 할 수있는 매우 일반적인 어댑터입니다. 그러나 작동하려면 좀 더 많은 코딩을해야합니다.ArrayAdapter
배열 또는 ArrayList
의 데이터에 대해 잘 작동하는보다 완벽한 구현입니다 . 마찬가지로 CursorAdapter
데이터가 Cursor
. 이 두 가지 모두 BaseAdapter
.데이터가 일종의 특수 컬렉션에 있거나 ArrayAdapter
제공 되는 기본 동작을 원하지 않는 경우 BaseAdapter
필요한 유연성을 얻기 위해 확장 할 수 있습니다.
각각의 성능은 실제로 구현하거나 동작을 변경하는 방법에 따라 다릅니다. 핵심적으로 둘 중 하나가 똑같이 효과적 일 수 있습니다 (특히 an ArrayAdapter
가 a라는 점을 고려 BaseAdapter
).
어떤 어댑터로든 원하는 것을 거의 할 수 있지만 이것이 BaseAdapter
추상적이므로 직접 사용할 수 없습니다.
ArrayAdapter
(@ tanis-7x에서 언급했듯이)은 TextView
목록 항목 내에 1 개만있을 수 있으며 실제로 매우 제한된 동작입니다. 각 목록 항목에 여러 컨트롤이있는 경우 BaseAdapter
및 작업을 직접 사용해야합니다 . 물론 당신은 여전히 사용할 수 ArrayAdapter
있기 때문에, ArrayAdapter
A는 BaseAdapter
.
BaseAdapter
ArrayAdapter
확장 하는 동안 추상 BaseAdapter
입니다 (의 구체적인 구현입니다 BaseAdapter
). 확장 ArrayAdapter
하면의 모든 ArrayAdapter
기능 이 상속 되고 구현을 재정의하면 ArrayAdapter
동작을 수정할 수 있습니다. 확장하는 경우 BaseAdapter
ArrayAdapter가 이미 구현 한 모든 Abstract 메서드를 구현해야합니다.
또한 ListView의 성능에 영향을 미칩니 까?
아니 그렇지 않아.
그리고 마지막 질문은 이러한 어댑터를 사용하여 ListView로 무엇이든 할 수 있습니까? 아니면 특정 어댑터 만 사용할 수있는 특정 경우가 있습니까?
SDK의 구현이 귀하의 요구를 충족한다면이를 재정의하고 바퀴를 다시 발명해야하는 이유는 무엇입니까?
그들 사이의 가장 큰 차이점은 즉 BaseAdapter
동안 인스턴스화 할 수 없습니다 ArrayAdapter
캔
3 가지 질문에 대한 답변 :
(1) Android 문서에 따르면 BaseAdapter 는 여러 어댑터 유형의 수퍼 클래스 일 뿐이며 그중 하나는 ArrayAdapter
. BaseAdapter
다른 목적에 맞는 여러 다른 어댑터가 파생 됩니다. 결과적으로 둘 사이의 효율성에는 차이가 있습니다. 다양한 하위 클래스를 사용하여 다른 함수 / 방법 집합에 액세스 할 수 있습니다.
(2) 효율성은 ArrayAdapter
해당 클래스 내에서 수행하는 작업의 효율성, 즉 비트 맵 및 기타 데이터 처리에 따라 달라집니다.
(3) 아마도 ListView
다른 종류의 어댑터를 사용하여 작업하는 방법을 알아낼 수 있지만, ArrayAdapter
작동 하는 이유 는 일반적으로 대화 형 목록을 작성하는 것이므로 의미가 있기 때문입니다. 는 ArrayAdapte
소요 Array
통상, ArrayList
그 다음에 대한 백업 정보를 생성하도록 처리하는, 개체 ListView
. 그런 의미에서 ArrayList
-> ArrayAdapter
-> 설정 ListView
은 논리적으로 의미가 있습니다.
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;
}
}
List<T> UserList;
확장하는 클래스에 ArrayAdapter<T>
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를 사용할 수 없습니다.
BaseAdapter
s는 더 최소화되고 사용자 정의 할 수 있습니다. ArrayAdapter
s는 s의 가장 일반적인 용도를 구현 ListAdapter
하지만 때로는 충분하지 않습니다.
그러나 ArrayAdapter
s를 사용하면 거의 모든 것을 얻을 수 있습니다 . ArrayAdapter를 올바르게 사용하여 목록이 이미 작동중인 경우 BaseAdapter에서 얻을 수있는 것이 없습니다.
그러나 당신이 저장하는 경우 Context
, Arrays
또는 Lists
당신의 ArrayAdapter와 구현에, 어쩌면 당신은 전환 할 것 BaseAdapter
같은, ArrayAdapter
이미 구현이있다.
어쨌든, 그렇게하는 경우 항상 해당 항목을 제거하고을 사용 getItem()
하여 배열 항목 getCount()
을 가져오고 배열의 크기를 가져오고 getContext()
뷰를 확장 할 수 있습니다.