Intereting Posts
Какова цель годовых репозиториев git в .repo / projects /, созданных сценарием репо Android? Текстовый редактор макета ADT eclipse xml – часто прерывается до закрытия файла и повторного открытия Можно ли использовать цветной + цвет в качестве фона? Пользовательские шрифты в Android PhoneGap Невозможно разрешить атрибут из пространства имен android. Как отменить диалоговое окно, например «Активность» при касании за пределами окна? Наложение прозрачного GLSurfaceview на существующий вид в Android? Android: EditText.setInputType (), как настроить для электронной почты, но не автоматически предлагать Что генерируется и промежуточные папки в каталоге сборки и почему отсутствует папка с выводами Ищете пример нового Android API setMediaButtonReceiver Как решить проблему производительности синтаксического анализа XML на Android Воспроизведение звука, поступающего с микрофона в режиме реального времени Как перепроектировать / декомпилировать Android APK, который был запутан с помощью ProGuard? Широковещательный приемник работает по-разному на разных версиях Android (4.1.1 и 4.2.2) Подход для исправления NoClassDefFoundError?

ListView повторно использует представления, когда … Я не хочу, чтобы он

У меня есть ListView , каждый из item которого содержит ToggleButton . После того, как я переключу его, а затем прокручиваю вверх или вниз, ListView перерабатывает представления, и поэтому некоторые из других зеркалируют проверенное состояние ToggleButton . Я не хочу этого. Как я могу предотвратить это?

Solutions Collecting From Web of "ListView повторно использует представления, когда … Я не хочу, чтобы он"

Android перерабатывает элементы списка для повышения производительности. Настоятельно рекомендуется повторно использовать их, если вы хотите, чтобы ListView прокручивался плавно.

Для каждого элемента списка getView функция getView вашего адаптера. Там, где вы должны назначить значения для элемента, который запрашивает ListView.

Взгляните на этот пример:

 @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if ( convertView == null ) { /* There is no view at this position, we create a new one. In this case by inflating an xml layout */ convertView = mInflater.inflate(R.layout.listview_item, null); holder = new ViewHolder(); holder.toggleOk = (ToggleButton) convertView.findViewById( R.id.togOk ); convertView.setTag (holder); } else { /* We recycle a View that already exists */ holder = (ViewHolder) convertView.getTag (); } // Once we have a reference to the View we are returning, we set its values. // Here is where you should set the ToggleButton value for this item!!! holder.toggleOk.setChecked( mToggles.get( position ) ); return convertView; } 

Обратите внимание, что ViewHolder – это статический класс, который мы используем для повторного использования этого представления. Его свойства – это виды, которые имеет ваш элемент списка. Он объявлен в вашем адаптере.

 static class ViewHolder{ ToggleButton toggleOk; } 

mToggles объявляется как частное свойство в вашем адаптере и устанавливается с помощью общедоступного метода:

 public void setToggleList( ArrayList<Boolean> list ){ this.mToggles = list; notifyDataSetChanged(); } 

Для получения дополнительной информации см. Другие пользовательские примеры ListView.

Надеюсь, поможет.

Добавьте эти два метода в свой адаптер.

 @Override public int getViewTypeCount() { return getCount(); } @Override public int getItemViewType(int position) { return position; } 

Вы можете использовать HashMap для сохранения состояния ваших кнопок:

  private Map<Integer,Boolean> listMapBoolean = new HashMap<Integer,Boolean>(); toggleButton.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { listMapBoolean.put(position, true); } else { listMapBoolean.put(position, false); } } }); 

И после раздувания представления вы читаете HashMap чтобы узнать, было ли это проверено или нет:

  for (Entry<Integer, Boolean> entry : listMapBoolean.entrySet()) { if (entry.getKey().equals(i)) { if(entry.getValue()) { System.out.println("ToggleButton is checked!"); } else { System.out.println("ToggleButton is not checked!"); } } } 

Не уверен, что это помогает на вашем пути. У меня также были проблемы с переработкой моего EditText в моем ListView .

Возможно, вам следует попытаться создать собственное представление списка с видом прокрутки и контейнером, в котором хранятся дети, которые будут добавлены в контейнер программно. Установите тег для идентификации ребенка, или вы можете использовать порядок для этого ребенка