안드로이드 SDK 의 메소드 getItem
와 getItemId
클래스 어댑터 의 목적이 궁금합니다 .
설명 getItem
에서 기본 데이터를 반환해야합니다. 따라서 이름 배열이 ["cat","dog","red"]
있고이를 사용하여 어댑터 a
를 만들면 a.getItem(1)
“dog”을 반환해야합니다. 맞습니까? 무엇을 a.getItemId(1)
반환 해야 합니까?
실제로 이러한 방법을 사용했다면 예를 들어 주시겠습니까?
답변
이 방법을 목록 데이터에 액세스하는 더 깔끔한 방법으로보고 있습니다. 같은 것을 통해 내 어댑터 객체에 직접 액세스하는 대신 myListData.get(position)
간단히 어댑터를 호출 할 수 있습니다 adapter.get(position)
.
동일합니다 getItemId
. 일반적으로 목록에서 객체의 고유 ID를 기반으로 일부 작업을 실행하려고 할 때이 방법을 사용합니다. 데이터베이스 작업시 특히 유용합니다. 반환 id
된 것은 데이터베이스의 객체에 대한 참조 일 수 있으며 (업데이트 / 삭제 / 등) 다른 작업을 수행 할 수 있습니다.
따라서 원시 데이터 객체에서 ID에 액세스하는 대신을 myListData.get(position).getId()
사용할 수 있습니다 adapter.getItemId(position)
.
이 메소드를 사용해야한다고 생각한 곳의 예는 SeparatedListViewAdapter를 사용하는 프로젝트였습니다 . 이 어댑터에는 여러 유형의 어댑터가 포함될 수 있으며, 각기 다른 유형의 데이터를 나타냅니다 (일반적으로). 호출 할 때 getItem(position)
온 SeparatedListViewAdapter
, 반환 된 객체는 위치가 당신이 그것을 보내이다 “섹션”에 따라 다를 수 있습니다.
예를 들어, 당신은 당신의 목록 (과일 사탕)에 2 개 섹션을 가지고 : 당신이 사용하는 경우 getItem(position)
와 position
의 항목에 우연히 과일 요청한 것보다, 다른 객체를받을 섹션 getItem(position)
으로 position
의 항목을 가리키는 사탕 부분. 그런 다음 getItemId(position)
어떤 종류의 데이터 getItem(position)
가 반환 되는지 나타내는 상수 ID 값을 반환하거나 사용중인 instanceof
개체를 결정하는 데 사용할 수 있습니다.
내가 언급 한 것 외에는,이 방법들을 사용해야한다고 생각한 적이 없다
답변
글쎄,이 질문은 더 간단하고 간단하게 대답 할 수있는 것 같습니다 … 🙂
간단히 말해서, Android를 사용하면 long
모든 ListView
항목 에 a 를 첨부 할 수 있습니다 . 간단합니다. 시스템이 사용자 선택을 통지하면, 선택된 것을 알려주는 세 가지 식별 변수가 수신됩니다 .
- 뷰 자체에 대한 참조
- 목록에서 숫자 위치
- 이것은
long
당신 이 개별 요소에 첨부했습니다.
이 세 가지 중 어떤 것이 가장 특정한 경우에 가장 다루기 쉬운 지 결정하는 것은 전적으로 귀하의 몫입니다. 그러나 세 가지 모두 항상 선택할 수 있습니다. 이것을 long
항목에 자동으로 첨부 된 태그로 생각하면 더 간단하고 읽기 쉽습니다.
일반적으로하는 일에 대한 오해는 간단한 관습에서 비롯됩니다. 모든 어댑터는 getItemId()
실제로이 세 번째 식별을 사용하지 않더라도 짝수 를 제공해야합니다 . 따라서 일반적으로 이러한 어댑터 (SDK의 샘플 또는 웹의 모든 샘플을 포함) position
는 단일 이유 때문에 단순히 반환 됩니다. 항상 고유합니다. 그러나 어댑터를 반환하는 경우 position
,이 정말 의미 가 전혀이 기능을 사용하지 않기 때문에 position
이미 알려져있다 어쨌든.
따라서 적합하다고 생각되는 다른 값을 반환 해야하는 경우 자유롭게 그렇게하십시오.
@Override
public long getItemId(int position) {
return data.get(position).Id;
}
답변
이 getItemId
방법은 주로 SQLite 데이터베이스가 지원하는 커서와 함께 작동하도록 설계되었습니다. 위치 1에있는 항목에 대한 기본 커서의 id 필드를 반환합니다.
귀하의 경우 1 위치의 항목에 대한 ID가 없습니다. ArrayAdapter의 구현이 -1 또는 0을 반환한다고 가정합니다.
편집 : 실제로, 그것은 단지 위치를 반환합니다 :이 경우 1
.
답변
내가 구현 한 후 그 언급하고자 getItem
하고 getItemId
당신이 사용할 수있는 ListView.getItemAtPosition 및 ListView.getItemIdAtPosition을 대신 어댑터를 통해가는, 당신에게 데이터에 직접 액세스 할 수 있습니다. 이것은 onClick 리스너를 구현할 때 특히 유용 할 수 있습니다.
답변
getItemId
올바르게 구현 하면 매우 유용 할 수 있습니다.
예 :
앨범 목록이 있습니다.
class Album{
String coverUrl;
String title;
}
그리고 당신은 다음 getItemId
과 같이 구현 합니다 :
@Override
public long getItemId(int position){
Album album = mListOfAlbums.get(position);
return (album.coverUrl + album.title).hashcode();
}
이제 항목 ID는 coverUrl 및 제목 필드 의 값에 따라 달라지며 변경 한 후 notifyDataSetChanged()
어댑터를 호출하면 어댑터는 각 요소의 getItemId () 메소드를 호출하고 id가 변경된 thouse 항목 만 업데이트합니다.
이것은 “무거운”작업을 수행하는 경우 매우 유용합니다 getView()
.
BTW :이 기능을 사용하려면 hasStableIds()
메소드가 false를 리턴 하는지 확인해야합니다 .
답변
getItem
또는 getItemId
목록에 항목이있는 데이터를 첨부하도록 주로 설계된 방법은 거의 없습니다. 의 경우 getItem
목록의 항목에 첨부 할 객체를 전달할 수 있습니다. 일반적으로 사람들이 돌아옵니다 null
. 목록에서 동일한 항목으로 첨부 할 수 getItemId
있는 고유 한 long
값입니다. 사람들은 일반적으로 목록에서 위치를 반환합니다.
사용법은 무엇입니까? 이러한 값은 목록의 항목에 바인딩되므로 사용자가 항목을 클릭 할 때 추출 할 수 있습니다. 이 값은 AdapterView
메소드를 통해 액세스 할 수 있습니다.
// template class to create list item objects
class MyListItem{
public String name;
public long dbId;
public MyListItem(String name, long dbId){
this.name = name;
this.dbId = dbId;
}
}
///////////////////////////////////////////////////////////
// create ArrayList of MyListItem
ArrayList<MyListItem> myListItems = new ArrayList<MyListItem>(10);
// override BaseAdapter methods
@Override
public Object getItem(int position) {
// return actual object <MyListItem>
// which will be available with item in ListView
return myListItems.get(position);
}
@Override
public long getItemId(int position) {
// return id of database document object
return myListItems.get(position).dbId;
}
///////////////////////////////////////////////////////////
// on list item click, get name and database document id
my_list_view.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// extract item data
MyListItem selectedItem = (MyListItem)parent.getItemAtPosition(position);
System.out.println("Your name is : " + selectedItem.name);
// extract database ref id
long dbId = id;
// or you could also use
long dbId = parent.getItemIdAtPosition(position);
}
});