여기에 몇 가지 답변을 찾은 후, 내 Listview가 실제로 내 신경을 쓰고있는 불안한 상황에 처해 있습니다.스크롤 후 ListView 항목 상태를 저장하고 관리하는 방법은 무엇입니까?
는 여기에 내가 찾았 질문이다 : 나는 다음과 같이 정의 행과 사용자 정의 어댑터를 사용하고
How to save state of CheckBox while scrolling in ListView?
. 이 세 가지 요소로 정의 로우로 표시된다
내리스트 뷰는 간단하다
1) ImageView
표시하는 접촉 화상이 원형으로 자른 단계;
2) 연락처 전체 이름을 일반 텍스트로 표시하는 TextView
;
3)이며, 마지막으로 CheckBox
의 purpouse를 보유하는 ImageView
이다.
마지막 요소에 집중하십시오. ImageView CheckBox와 유사하게 클릭 할 때 src
이 변경됩니다. 사용자가 클릭하면 ImageView는 이전 상태에 따라 확인 표시와 확인되지 않은 표시 사이를 전환합니다. 가능한 상태는 다음과 같습니다. {checked | unchecked}
지금까지는 그렇게 좋았습니다. 그러나 ListView를 스크롤하자마자, 안드로이드가 사용하지 않는 뷰를 재활용함에 따라 전술 한 변경 사항이 사라집니다. 이른바 ViewHolder
패턴이 있습니다. 불행히도,이 패턴은 두 가지 문제에 나를 괴롭 히고 있습니다 :
첫 번째로, 스크롤 할 때, 알파벳 순서의 정리 된리스트 뷰는 혼란스러워집니다. 예 : 어떻게 든 whitout 어떤 이유라도, 처음에 표시된 연락처 이름은 내가 스크롤 할 때 ListView에서 나중에 다시 표시됩니다. 그것은 어떤 행에서도 발생할 수 있습니다! 따라서 사용하지 않은 뷰가 잘못 재사용되고있는 것처럼 보일 수 있습니다.
둘째, 첫 번째 문제에 따라 확인 된 상태는 유지되는 것처럼 보이지만 항상 유지되는 것은 아닙니다. 잘못된 상태로 유지 될 수 있습니다. 코스. 따라서 ViewHoder
은 실행 가능한 솔루션이 아닙니다.
HashMap
을 사용하고 있습니다 :
ContactsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public final void onItemClick(final AdapterView<?> adapterView, final View view,
final int position, final long id) {
final ImageView check = (ImageView) view.findViewById(R.id.checkImage);
final TextView name = (TextView) view.findViewById(R.id.contactName);
final Boolean isChecked = Boolean.valueOf(checkedContactsList.isChecked(position));
if (isChecked != null && isChecked.booleanValue() == true) {
check.setImageDrawable(getActivity().getResources().getDrawable(R.drawable.unchecked_sign));
checkedContactsList.(position);
} else {
check.setImageDrawable(getActivity().getResources().getDrawable(R.drawable.checked_sign));
checkedContactsList.add(position, true);
}
}
});
내가 position
대신 다른 값을 추가했습니다. 내가 시도한 ContactsListView.getPositionForView(view)
그리고 나는 또한보기의 ID로 시도했지만 여전히 작동하지 않습니다. ContactsListView.getSelectedItemPosition()
을 사용할 수 있으면 좋겠지 만 터치/클릭 이벤트를 처리 중이므로 선택 이벤트가 없으므로 -1
을 반환합니다.
public final View getView(final int position,
final View convertView, final ViewGroup parent) {
final LayoutInflater inflater = (LayoutInflater) this.context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View contactRowView = inflater.inflate(R.layout.contact_row, parent, false);
final ImageView contactPic = (ImageView) contactRowView.findViewById(R.id.contactPic);
final TextView contactName = (TextView) contactRowView.findViewById(R.id.contactName);
final ImageView checkImage = (ImageView) contactRowView.findViewById(R.id.checkImage);
// the list is the same as above and therefore contains the exact same entries
if (this.checkedContactsList.isChecked(position))
checkImage.setImageDrawable(this.context.getResources().getDrawable(R.drawable.checked_sign));
contactPic.setImageBitmap(cropePictureInCircle(this.contacts.get(position).getPicture()));
contactName.setText(this.contacts.get(position).getName());
return contactRowView;
}
주어진 알파벳 순서로 체크되지 않은 체크 확인 행과 선택하지 않은 행을 유지하는 좋은 방법이 있나요 : 내 Custom Adapter
이 어떻게 보이는지
는 그리고이 무엇입니까?
감사합니다.