2013-03-27 36 views
0

我想设置ListView,每行包含CheckBox,TextView和ImageView。 我在实现中使用自己的适配器,但是当我向下滚动某些复选框时没有任何理由被选中: 例如,我选中第一行中的复选框(位于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; 

} 

请你帮我弄清楚我做错了什么?

编辑:当我使用每次调用getView函数时(不使用convertView)膨胀视图的天真方式,一切正常。

回答

-1

WRONG:

您使用setSelected,而你应该在CheckBox查看这样使用setChecked

selected.setChecked (checkedItems[position]); 

的的setSelected方法设置一个的选择状态行ListView(或另一个AdapterView)。

编辑:

您设置setOnCheckedChangeListenerCheckBox视图。然后,您尝试读取setOnCheckedChangeListener设置为的视图的标签 - 这是CheckBox。但是,您从不设置CheckBox的标签!所以,你在setOnCheckedChangeListener中读到的标签是错误的。

必须设置这样的:

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

......然后,在setOnCheckedChangeListener,读这样的:

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

我也尝试将其更改为setChecked()方法,但复选框仍然混合,问题仍然存在。 – galvan 2013-03-27 23:06:58

+0

在私有函数SetViewInfo()下,我将复选框的标记设置为位置。我也尝试记录我选择的每个复选框的编号,并打印每个复选框的正确编号。 – galvan 2013-03-27 23:20:16

0

移动以下之外,如果行语句

holder.name.setOnClickListener(ActionBar.this); 
holder.selected = (CheckBox) convertView.findViewById(R.id.browser_selected); 
holder.selected.setOnCheckedChangeListener(ActionBar.this); 
相关问题