2014-02-20 1 views
1

Я разрабатываю приложение, используя ListView с простым пользовательским адаптером, каждая строка содержит объект CheckBox. Однако из-за функции утилизации ListView (которую я не планирую отключать), когда проверяется какой-либо из ящиков, также проверяются другие элементы ниже или выше в ListView.Android checkbox Listview recycling вызывает неожиданную проверку коробки

Следующая моя GetView() адаптер, наряду с пользовательским классом ViewHolder:

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

    if (convertView == null) { 
     LayoutInflater mInflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = mInflater.inflate(R.layout.populate_friends_row, null); 
     holder = new ViewHolder(); 
     holder.nameCheckBox = (CheckBox) convertView.findViewById(R.id.isFriend); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    holder.nameCheckBox.setText(data.get(position).contactLabel); 
    holder.nameCheckBox.setChecked(checked.get(position)); 
    holder.nameCheckBox.setTag(String.valueOf(position)); // to properly track the actual position 
    holder.nameCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener(){ 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, 
       boolean isChecked) { 
      int pos = Integer.parseInt(buttonView.getTag().toString()); 
      checked.set(pos, isChecked); 
     } 

    }); 

    return convertView; 
} 

public static class ViewHolder { 
    public CheckBox nameCheckBox; 
} 

Я уже держал проверенные коробки в ArrayList из булевы: проверено.

Любая помощь будет оценена, спасибо.

+0

Есть ли конкретная причина, вы используете 'String' для тега CheckBox в вместо' Integer'? – frozenkoi

ответ

1

Когда вы вызываете holder.nameCheckBox.setChecked(checked.get(position));, чтобы настроить представление, которое будет отображаться для этого представления, слушатель вызывается, в то время как тег по-прежнему имеет положение предыдущего флажка.

Попробуйте удалить слушателя (установка его null) перед вызовом setChecked

+0

Это сработало! Огромное спасибо. – yadawg

Смежные вопросы