아래는 ListView가있는 코드 조각입니다. emptyView와 headerView를 추가했습니다. headerView를 추가하면 onItemClick의 위치가 1 씩 증가합니다.
따라서 headerView가 없으면 첫 번째 목록 요소의 위치가 0이고 headerView가있는 첫 번째 목록 요소의 위치는 1이됩니다!
이로 인해 내 어댑터에서 오류가 발생합니다. 예를 들어 getItem ()을 호출하고 다른 메서드를 사용할 때 아래를 참조하십시오. 이상한 점 : 어댑터의 getView () 메서드에서 headerView가 추가 되더라도 첫 번째 목록 요소가 위치 0으로 요청됩니다 !!
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ListView list = (ListView) viewSwitcher.findViewById(R.id.list);
View emptyView = viewSwitcher.findViewById(R.id.empty);
list.setEmptyView(emptyView);
View sectionHeading = inflater.inflate(R.layout.heading, list, false);
TextView sectionHeadingTextView = (TextView) sectionHeading.findViewById(R.id.headingText);
sectionHeadingTextView.setText(headerText);
list.addHeaderView(sectionHeading);
list.setAdapter(listAdapter);
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
listAdapter.getItem(position);
//Do something with it
}
});
}
일부 어댑터 방법 :
@Override
public int getViewTypeCount() {
return TYPE_COUNT;
}
@Override
public int getItemViewType(int position) {
return (position < items.size()) ? ITEM_NORMAL : ITEM_ADVANCED;
}
@Override
public Product getItem(int position) {
return items.get(position);
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return (position < items.size());
}
headerView를 추가 할 때 이것이 정상적인 동작입니까 ?? 내 어댑터의 문제를 극복하는 방법은 무엇입니까?
답변
난 그냥이 문제를 가로 질러 와서 가장 좋은 방법은 사용하는 것 ListView.getItemAtPosition(position)
대신 ListAdapter.getItem(position)
은 AS ListView
버전은 헤더, 즉를 차지한다 : –
대신 다음을 수행하십시오.
myListView.getItemAtPosition(position)
답변
헤더 클릭에 신경 쓰지 않는 경우 위치에서 헤더보기 수를 빼서 어댑터 위치를 가져옵니다.
listView.addHeaderView(inflater.inflate(
R.layout.my_hdr_layout, null), null, false);
listView.setAdapter(m_adapter);
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
position -= listView.getHeaderViewsCount();
final MyObject object = m_adapter.getItem(position);
}
});
답변
ListView
목록의 첫 번째 항목이 되는에 헤더를 추가하는 경우 . 를 재정 의하여 getCount()
항목 하나를 적게 반환 하여이를 보완 할 수 있지만 헤더가 위치 0에있는 항목이므로 getItem()
, getItemId()
등 을 처리해야합니다 .
답변
구현할 때 AdapterView.OnItemClickListener
위치에서 헤더를 뺍니다.
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
position -= mListView.getHeaderViewsCount();
// what ever else follows...
}
답변
코드를 변경할 필요가 없습니다. 아래 코드를 사용하십시오.
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
parent.getAdapter().getItem(position);
//Do something with it
}
});
답변
어댑터를 사용하지 말고 getAdapter의 ‘장식 된’어댑터를 사용하십시오.
답변
이에 대한 한 가지 해결책은 ID를 색인에 매핑하는 것입니다. 기본적으로 id가 목록의 색인을 반환하고 클릭 리스너는 다음을 수행합니다.
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
listAdapter.getItem((int) id);
}