2

여기에 몇 가지 답변을 찾은 후, 내 Listview가 실제로 내 신경을 쓰고있는 불안한 상황에 처해 있습니다.스크롤 후 ListView 항목 상태를 저장하고 관리하는 방법은 무엇입니까?

는 여기에 내가 찾았 질문이다 : 나는 다음과 같이 정의 행과 사용자 정의 어댑터를 사용하고

Maintain ListView Item State

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은 실행 가능한 솔루션이 아닙니다.

ViewHolder 패턴을 discouvering 전에, 나는 다음과 같이 클릭시 아이템의 위치를 ​​저장하는 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이 어떻게 보이는지

는 그리고이 무엇입니까?

감사합니다.

답변

1

목록 위치 변경에 대해서는 해결책을 알고 있지만 두 번째 문제에 대해서는 여전히 솔루션을 찾고 있습니다. 어쨌든 먼저 viewHolder 클래스를 만듭니다.

public class ViewHolder{ 
     //put all of your textviews and image views and 
     //all views here like this 
     TextView contactName; 
     ImageView checkImage; 
     ImageView contactImage; 
} 

그런 다음 어댑터를 편집 : 내 휴대 전화에서 코드를 작성하는 것은 전혀 어색하기 때문에

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    final View contactRowView = convertView; 
    ViewHolder holder; 
    if (contactRowView == null) { 
     final LayoutInflater inflater = (LayoutInflater) 
       this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE 
       ); 

     contactRowView = 
       inflater.inflate(R.layout.contact_row, parent, 
         false); 
     holder = new ViewHolder(): 
     holder.contactPic = (ImageView) 
       contactRowView.findViewById(R.id.contactPic); 
     holder.contactName = (TextView) 
       contactRowView.findViewById(R.id.contactName); 
     holder.checkImage = (ImageView) 
       contactRowView.findViewById(R.id.checkImage); 
     contactRowView.setTag(holder); 
    } else { 
     holder = contactRowView.getTag(); 

     // the list is the same as above and therefore  contains the exact same entries 
     if (this.checkedContactsList.isChecked(position)) 

      holder.checkImage.setImageDrawable(this.context.get. 
        Resources().getDrawable(R.drawable.checked_sign)); 


     holder.contactPic.setImageBitmap(cropePictureInCircle(this.contacts.get(position).getPicture())); 

     holder.contactName.setText(this.contacts.get(position).getName()); 
     return contactRowView; 
    } 
} 

희망이 도움 죄송합니다.