Автоматический вызов checkbox onCheckedChange при прокрутке списка?

У меня проблема с списком, в элементе списка которого есть флажок. Когда я проверю список и список прокрутки, установите флажок когда-либо автоматический вызов oncheckedchange и значение флажка будет изменено!

Или, когда мой список содержит более 9 или 10 элементов, тогда, когда я проверил элемент 1, отметьте пункт 8 или 9 ???

Кто-нибудь может сказать мне, что я исправить эту ошибку?

Заранее спасибо!

list_item.xml

   

и вот вид адаптера:

  public View getView(int position, View convertView, ViewGroup parent) { Log.e(TAG, "getView"); ViewHolder mViewHolder; if (convertView == null) { Log.e(TAG, "Inflater is inflating..."); convertView = mInflater.inflate(R.layout.custom_list_app, null); mViewHolder = new ViewHolder(); mViewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.checkbox); mViewHolder.remove = convertView.findViewById(R.id.music_info); convertView.setTag(mViewHolder); } else { mViewHolder = (ViewHolder) convertView.getTag(); Log.e(TAG, "Position: " + position + " CheckBox: " + mViewHolder.checkbox.isChecked()); } mViewHolder.checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton cb, boolean flag) { // TODO Auto-generated method stub if (flag) { Log.d(TAG, "Checkbox checked"); } else { Log.d(TAG, "Checkbox un-checked"); } } }); return convertView; } 

ListView перерабатывает classы представления: вам нужно явно указать, проверяется ли CheckBox в classе getView . Поэтому добавьте чек, как

 /** * Ensure no other setOnCheckedChangeListener is attached before you manually * change its state. */ mViewHolder.checkbox.setOnCheckedChangeListener(null); if(shouldBeChecked) mViewHolder.checkbox.setChecked(true); else mViewHolder.checkbox.setChecked(false); 

перед вызовом setOnCheckedChangeListener .

 holder.cBox.setOnCheckedChangeListener(null); holder.cBox.setChecked(list.get(position).isChecked()); holder.tvName.setText(item.getName()); holder.cBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { list.get(position).setChecked(true); } else { list.get(position).setChecked(false); } } }); 

В списке элемент имеет атрибут, чтобы установить, отмечен ли элемент или нет. Вы можете использовать это, чтобы установить элемент, если он установлен, и сначала вы должны установить

 cBox.setOnCheckedChangeListener(null); cBox.setChecked(list.get(position).isChecked()); 

Затем установите new OnCheckedChangeListener()

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

Я не уверен, что это аккуратный способ. Но приведенный ниже код решил мою проблему. Даже в приведенном ниже коде функция setOnCheckChangeListener () вызывалась (считывается ложно) при прокрутке списка. Задача состояла в том, чтобы сохранить список элементов, выбранных пользователем. Поэтому, когда есть триггер, я сначала ссылаюсь на свой список и добавляю только элемент, если он еще не присутствовал в списке, иначе я игнорирую обратный вызов.

 @Override public View getView(final int position, View convertView, final ViewGroup parent) { MenuViewHolder menuViewHolder = null; MenuView item = getItem(position); LayoutInflater inflater = ((Activity) context).getLayoutInflater(); convertView = inflater.inflate(R.layout.food_menu_list_layout, null); TextView textView = ((TextView) convertView.findViewById(R.id.menu_item_entry)); TextView price = (TextView) convertView.findViewById(R.id.price); CheckBox ordered = (CheckBox) convertView.findViewById(R.id.checkBox); menuViewHolder = new MenuViewHolder(textView, price, ordered); menuViewHolder.dishName.setText(menuViewList.get(position).getItemname()); menuViewHolder.price.setText("$" + menuViewList.get(position).getPrice()); menuViewHolder.ordered.setChecked(menuViewList.get(position).isSelected()); menuViewHolder.ordered.setOnCheckedChangeListener(null); menuViewHolder.ordered.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { MenuView checkedItem = menuViewList.get(position); if (buttonView.isChecked()) { //add item only if not already added if (!checkedItem.isSelected()) { MainActivity.menuViews.add(checkedItem); checkedItem.setSelected(buttonView.isChecked()); } } else { //remove only if already added if (checkedItem.isSelected()){ MainActivity.menuViews.remove(checkedItem); checkedItem.setSelected(buttonView.isChecked()); } } ((MainActivity) context).displayCurrentSelectionAmt(); } }); return convertView; } 

Большинство из них слишком вовлечены (но они действительно работают). Все, что вы пытаетесь сделать, это остановить событие .setChecked от стрельбы, если просмотр загружается и установить статус проверки. Итак, установите локальную переменную classа isLoading, установите ее в true в начале getView и установите для нее значение false в конце getView. Затем в прослушивателе кликов установите флажок isLoading

 boolean isLoading; public View getView(int position, View convertView, ViewGroup parent){ isLoading = true; ...do your initialization here isLoading = false; return convertView; } checkview.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton pckView, boolean pisChecked) { if(! isLoading) { ...do your things when the check is actually clicked } } }); 

OnClickListener работает для меня с той же проблемой, и я могу отправить данные в другую деятельность

holder.cks.setOnClickListener (новый View.OnClickListener () {

  @Override public void onClick(View v) { final boolean isChecked = holder.cks.isChecked(); if (isChecked) { System.out.println(position + "Checked"); holder.cks.setChecked(true); positionArray.set(position, true); DATA2="1"; } else { System.out.println(position + "unChecked"); holder.cks.setChecked(false); positionArray.set(position, false); DATA2 = "0"; } DATA1=String.valueOf(position+1); DATA3=map.get(COL5); DATA4=map.get(COL6); DATA5=map.get(COL7); Intent intent = new Intent(activity, updatelicaldata.class); intent.putExtra("message1", DATA1); intent.putExtra("message2", DATA2); intent.putExtra("message3", DATA3); intent.putExtra("message4", DATA4); intent.putExtra("message5", DATA5); System.out.println("ACTIVITY IS START"); activity.startActivity(intent); } }); 
  • java.lang.NoClassDefFoundError: android / graphics / drawable / Icon
  • Android Studio - Как увеличить размер выделенной кучи
  • Ошибка авторизации API Google Android v2
  • как проектировать любой размер экрана и плотность в Android (многоэкранный режим для мобильных телефонов в Android)
  • Как создать горизонтальный ListView с помощью RecyclerView?
  • Приемник смены режима звонка Широковещательный приемник?
  • Ошибка манифеста слияния
  • Рекомендуемый способ форматирования чисел в локали?
  • Могу ли я хранить файлы изображений в firebase с помощью Java API
  • Как отобразить пользовательский вид в ActionBar?
  • Как отменить диалог, например «Активность», когда он коснулся за пределами windows?
  • Давайте будем гением компьютера.