2013-03-27 3 views
0

각 행에 CheckBox, TextView 및 ImageView가 포함 된 ListView를 설정하려고합니다. 구현에 내 자체 어댑터를 사용하지만 일부 스크롤 다운 할 때 이유가 없으면 선택란을 선택합니다. 예를 들어 첫 번째 행 (0 위치)의 확인란을 선택하여 스크롤 한 다음 갑자기 요소를 행 17도 확인되고 언젠가 내가 처음으로 돌아 가면 확인란이 선택되지 않습니다.목록 스크롤시 ListView의 체크 박스가 섞여 있습니다.

private class ViewHolder{ 
     ImageView image; 
     TextView name; 
     CheckBox selected; 
    } 

private class BrowserAdapter extends ArrayAdapter<String> { 

    public BrowserAdapter(Context context, int resource, int textViewResourceId, List<String> objects) { 
     super(context, resource, textViewResourceId, objects); 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) {  
     ViewHolder holder; 

     if (convertView==null){ 
      LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.browser_list_row, parent, false); 

      holder = new ViewHolder(); 

      holder.image = (ImageView) convertView.findViewById(R.id.browser_image); 

      holder.name = (TextView) convertView.findViewById(R.id.browser_file_name); 
      holder.name.setOnClickListener(ActionBar.this); 

      holder.selected = (CheckBox) convertView.findViewById(R.id.browser_selected); 
      holder.selected.setOnCheckedChangeListener(ActionBar.this); 

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

     } 

     setViewInfo(holder.image, holder.name, holder.selected, position); 

     return convertView; 
    } 

    private void setViewInfo(ImageView image, TextView name, CheckBox selected , int position) { 

     name.setTag(position); 

     selected.setTag(position); 
     selected.setChecked(checkedItems[position]); 

     name.setText(myList.get(position)); 
     File temp_file = new File(file, myList.get(position)); 

     if (temp_file.isFile()) 
      image.setImageResource(R.drawable.mp3file); 
     else 
      image.setImageResource(R.drawable.folder); 
    } 

}//class BroswerAdapter 

인수 checkedItems 다음 코드에서와 같이 목록에서 체크 박스의 상태를 저장 부울 배열 :

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

    checkedItems[(Integer)buttonView.getTag()] = isChecked; 

} 

수 당신이 제발

나는 다음과 같은 코드를 사용 내가 뭘 잘못하고 있는지 알아낼 수있게 도와 줘?

편집 : convertView를 사용하지 않고 getView 함수를 호출 할 때마다보기를 부 풀리는 간단한 방법을 사용할 때 모든 것이 잘 작동합니다.

답변

-1

잘못된 :이 같은 CheckBox보기에 setChecked 를 사용해야하는 동안은, setSelected을 사용하는

는 :

selected.setChecked (checkedItems[position]); 

하는 setSelected 방법은 의 선택 상태를 설정 행ListView (또는 또 다른 AdapterView) 내에 있습니다.

편집 :

당신은 CheckBox보기로 setOnCheckedChangeListener을 설정합니다. 그런 다음 setOnCheckedChangeListener이 설정된보기 태그를 읽으려고합니다.이 태그는 CheckBox입니다. 그러나 태그를 설정하지 마십시오 CheckBox! 따라서 setOnCheckedChangeListener에서 읽은 태그가 잘못되었습니다.

holder.selected.setTag ("" + position); 

... 다음의 setOnCheckedChangeListener 이와 같이 읽어 :

이처럼 설정해야 외부

checkedItems[Integer.parseInt (buttonView.getTag())] = isChecked; 
+0

또한 setChecked() 메소드로 변경하려고했지만 체크 박스가 여전히 혼합되어 있으며 문제가 여전히 발생합니다. – galvan

+0

개인 기능 SetViewInfo()에서 확인란의 태그를 위치로 설정합니다. 나는 또한 내가 선택한 각 확인란의 번호를 기록하려고 시도하고 정확한 번호를 각 확인란을 인쇄합니다. – galvan

0

이동 다음 줄 경우를 문

holder.name.setOnClickListener(ActionBar.this); 
holder.selected = (CheckBox) convertView.findViewById(R.id.browser_selected); 
holder.selected.setOnCheckedChangeListener(ActionBar.this); 
관련 문제