2011-03-25 6 views
6

목록에서 여러 항목을 선택할 수있는 체크 박스가있는 사용자 정의 목록을 만들려고합니다.체크 박스 문제가있는 사용자 정의 목록보기

체크 박스가있는 목록은 ok로 표시되지만 확인란을 선택한 다음 다른 항목을 아래로 스크롤하면 목록이 확인됩니다.

그것의 기본적 here

와 같은 문제를 내가 길의 안드로이드와 함께 할 수있는 뭔가가보기를 재활용 그러나 나는이 문제를 해결하는 방법을 볼 수 없습니다 이해! 누군가가 나를 도울 수 있습니까 ???

감사합니다 - 마이크

답변

5

확인할 행을 추적하려면 데이터 구조가 필요합니다. 이것은 bool[] checked처럼 간단 할 수 있습니다.

getView에는 체크 박스 상태를 checked[position]의 내용으로 설정해야합니다. getView의 확인란에 set an OnCheckedChangedListener도 입력해야 데이터가 으로 업데이트됩니다.

예, ListView의 행은 재활용되므로 getView을 떠나기 전에 행에 대한 모든 적절한 데이터를 채우십시오.

+1

우수한 작품을 확인하는 방법 부분 아래 가 표시됩니다 최신 값

EDITED PART 걸릴 것입니다! 나는 스크롤 할 때마다 getView 메소드가 실제로 호출된다는 것을 알지 못했다! 전체 목록이 초기화 된 다음 getView 메서드가 다시 호출되지 않는다고 생각했습니다! – mixkat

+0

나는 이것을 고쳤다 고 생각했지만 틀렸다.그 이상한 이유는 setOnCheckedChangeListener에서 작동하기 위해서 다른 방법이 필요합니다. 즉, isChecked가 배열의 해당 필드를 false로 설정하고 그렇지 않으면 true로 설정해야합니다. 하지만 어떤 체크 박스가 체크되어 있는지 확인해야 할 때 모든것이 엉망이됩니다.주의 : 제대로 설정했다면, 박스가 체크되어 졌을 때 배열 필드를 true로 설정하면 스크롤을 내려서 다시 백업하면 모든 것이 손실됩니다. 모든 아이디어 왜 이런 일이 일어 났습니까? – mixkat

+0

재활용 된 뷰에 대해서도'setChecked'를 호출하고 있습니까? 즉, if 문 밖에서 재활용되거나 재활용되지 않는 뷰를 채 웁니다. * /' –

0

ArrayList<Integer>을 작성하십시오. 확인란에 OnCheckChangedListener을 추가하십시오. 변경된 방법 내에서 ArrayList<Integer>에 목록보기 position을 추가하거나 제거하십시오.

getView 방법의 경우 ArrayList<Integer>에 현재 목록보기 position이 포함되어 있는지 확인하십시오. 위치가 포함되어 있으면 checked를 true로 설정하고, 그렇지 않으면 false로 설정합니다.

체크 박스를 클릭 할 때마다 ArrayList에서 Integer을 추가 또는 삭제하십시오.

2

OnCheckChangedListener 대신 CheckClick에 대해 OnClickListener를 구현해 볼 수 있습니다. 그것은 나를 위해 일했습니다. - 아래 코드

0

확인 항상

public View getView(int position, View convertView, ViewGroup parent){ 
      View view = convertView; 
      ViewHolder holder = new ViewHolder(); 

      if(view == null){ 

       view = inflater.inflate(R.layout.list_callcycle_blue, null);     
       holder.llContainer = (LinearLayout) view.findViewById(R.id.ll_container); 
       holder.lblLabel = (TextView) view.findViewById(R.id.txt_desc); 
       holder.cb = (CheckBox) view.findViewById(R.id.cb_store); 

       view.setTag(holder); 
      } else { 
       holder = (ViewHolder) view.getTag(); 
      } 

      final Object data = getItem(position); 
      holder.lblLabel.setText(data.getDescription()); 

      holder.cb.setTag(position); 
      holder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

        int position = (Integer) buttonView.getTag(); 
        objects.get(position).setChecked(buttonView.isChecked()); 
       } 
      }); 
      holder.cb.setChecked(isChecked(position)); 

      return view; 
     } 

명심, 이용 변화는 holder.cb.setOnCheckedChangeListener()이 데이터를 설정되기 전에 어떤 청취자는, 우리의 경우는 holder.cb.setChecked()

이유입니다 : 때 우리 scroll, listview는 뷰를 재활용 할 것이므로, setchecked가 리스너보다 먼저 사용된다면 오래된 리스너를 기준으로 값을 선택할 것이다. 우리가 청취자 후를 설정한다면, 그것은 검색에 사용 isChecked()setChecked() 방법은 마법처럼 데이터

/* 
* This function is in your Custom Adapter Class 
*/ 
private boolean isChecked(int position){ 
    return object(position).isChecked(); 
} 


/** 
* Getter Setter Class/Data Model Class that defines your object 
*/ 
private class MyObject{ 
    private boolean isChecked; 
    private String a, b, c, orWhateverYourObjectNeeds; 

    public void setChecked(boolean isChecked){ 
     this.isChecked = isChecked; 
    } 

    public boolean isChecked(){ 
     return isChecked 
    } 
} 
+0

안녕하세요 Jimit Patel, "오브젝트"와 "isChecked (위치)"를 어떻게 얻을 수 있는지 설명해 주실 수 있습니까? 위의 코드? –

+0

고맙습니다. 오래 전에 편집 해 주셨습니다. 의사 소통하는 걸 잊었 어, 미안해. –

관련 문제