답변:
이 방법을 목록 데이터에 액세스하는 더 깔끔한 방법으로보고 있습니다. 같은 것을 통해 내 어댑터 객체에 직접 액세스하는 대신 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
개체를 결정하는 데 사용할 수 있습니다.
내가 언급 한 것 외에는,이 방법들을 사용해야한다고 생각한 적이 없다
getView
, getCount
, getViewTypeCount
, 등 제대로 목록보기 UI를 보여주는 용으로 사용된다. 다른 함수는 단순히 getItem
내부에서 자주 사용하지만 항목을 클릭 할 때 추가 작업을 수행하는 것과 같은 다른 기능을 구현하는 데 도움이 됩니다.getView
getItemId
반품 0L
하거나 null
어디서나 사용하지 마십시오. UUID가 long
ID의 가치보다 더 가치있는 이유는 없습니다 . 연결 해제 모드? 그게 뭐야?
글쎄,이 질문은 더 간단하고 간단하게 대답 할 수있는 것 같습니다 ... :-)
간단히 말해서, Android를 사용하면 long
모든 ListView
항목 에 a 를 첨부 할 수 있습니다 . 간단합니다. 시스템이 사용자 선택을 통지하면, 선택된 것을 알려주는 세 가지 식별 변수가 수신됩니다 .
long
당신 이 개별 요소에 첨부했습니다.이 세 가지 중 어떤 것이 가장 특정한 경우에 가장 다루기 쉬운 지 결정하는 것은 전적으로 귀하의 몫입니다. 그러나 세 가지 모두 항상 선택할 수 있습니다. 이것을 long
항목에 자동으로 첨부 된 태그로 생각하면 더 간단하고 읽기 쉽습니다.
일반적으로하는 일에 대한 오해는 간단한 관습에서 비롯됩니다. 모든 어댑터는 getItemId()
실제로이 세 번째 식별을 사용하지 않더라도 짝수 를 제공해야합니다 . 따라서 일반적으로 이러한 어댑터 (SDK의 샘플 또는 웹의 모든 샘플을 포함) position
는 단일 이유 때문에 단순히 반환 됩니다. 항상 고유합니다. 그러나 어댑터를 반환하는 경우 position
,이 정말 의미 가 전혀이 기능을 사용하지 않기 때문에 position
이미 알려져있다 어쨌든.
따라서 적합하다고 생각되는 다른 값을 반환 해야하는 경우 자유롭게 그렇게하십시오.
@Override
public long getItemId(int position) {
return data.get(position).Id;
}
getItemId()
...이 방법이 사용자 정의 어댑터에서 무시되지 않으면 어떻게됩니까?
이 getItemId
방법은 주로 SQLite 데이터베이스가 지원하는 커서와 함께 작동하도록 설계되었습니다. 위치 1에있는 항목에 대한 기본 커서의 id 필드를 반환합니다.
귀하의 경우 1 위치의 항목에 대한 ID가 없습니다. ArrayAdapter의 구현이 -1 또는 0을 반환한다고 가정합니다.
편집 : 실제로, 그것은 단지 위치를 반환합니다 :이 경우 1
.
-1
. 구현은 다음과 같습니다assert false : "TODO"; return -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를 리턴 하는지 확인해야합니다 .
hasStableIds()
거짓 을 반환 해야 합니까? 동일한 문자열에서 계산 된 해시 코드는 매번 동일한 값을 반환하는 것으로 보입니다. 이것은 docs 에 따라 안정적인 ID 입니다.
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);
}
});
getItemId()
에ArrayAdapter()
항상 반환-1
에assert false : "TODO"; return -1;