Checkbox auto call onCheckedChange cuando se desplaza el listview?
Tengo un problema con listview cuyo elemento de lista contiene una casilla de verificación. Cuando compruebo una caja y una lista de la voluta, la casilla de verificación alguna vez la llamada automática oncheckedchange y el valor de la casilla de verificación se cambian!
¿O, cuando mi lista tiene más de 9 o 10 artículo, entonces cuando comprobé en el artículo 1, el artículo 8 o 9 está comprobado ???
- ¿Hay una manera de desactivar el ajuste de línea en una vista de lista en android?
- Android string-array de archivo xml a ListView
- FastScrollBar salir de la pantalla, cuando SectionIndexer implementado
- CheckedTextView no marcado
- agregar clic Listner en cada elemento de fila en ListView
¿Alguien puede decirme qué puedo arreglar este error?
¡Gracias por adelantado!
List_item.xml
<ImageView android:layout_alignParentLeft="true" android:layout_width="36dip" android:layout_height="36dip" android:layout_centerVertical="true" android:scaleType="fitCenter" android:id="@+id/image_view" android:src="@drawable/icon" /> <TextView android:layout_toRightOf="@id/image_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="5dip" android:id="@+id/text_view" android:lines="1" android:textSize="20sp" android:textColor="@color/white" /> <TextView android:layout_toRightOf="@id/image_view" android:layout_below="@id/text_view" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingLeft="5dip" android:id="@+id/text_view2" android:textSize="14sp" android:lines="1" android:textColor="@color/white" />
Y aquí está la vista del adaptador:
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; }
- Android: agregar elementos a un ListView con TranscriptMode establecido en Normal
- Cómo actualizar el ListView en lista de arrastre de ListView?
- Cómo ocultar el popup de filtro en ListView en Android?
- La adición de una vista crea un ListView dentro de un fragmento para actualizar
- ListView dinámico en Android Studio: Selección de elemento aleatorio y vista de lista de actualizaciones
- Imagen local a través de json local en android
- ¿Es mejor recrear el adaptador listview o borrar y repoblar?
- TextView en las filas listview que muestran valores repetidos en desplazamiento en Android?
El ListView
recicla las clases de vista: necesitará establecer explícitamente si el CheckBox está o no seleccionado en la clase getView
. Así que agrega un cheque como
/** * 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);
Antes de llamar 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); } } });
En la lista, el elemento tiene un atributo para establecer si el elemento está marcado o no. Puede utilizarlo para configurar el elemento si está marcado, y primero debe
cBox.setOnCheckedChangeListener(null); cBox.setChecked(list.get(position).isChecked());
A continuación, establezca el verdadero new OnCheckedChangeListener()
Espero que mi respuesta sea útil para usted y para aquellos que miran esta página o tienen problemas para tratar con listas que tienen casillas de verificación de elementos.
No estoy seguro si esto es una manera aseada. Pero el siguiente código resolvió mi problema. Incluso en el siguiente código, el setOnCheckChangeListener () se estaba llamando (leer falsamente disparado) en el desplazamiento de la lista. La tarea consistía en mantener una lista de elementos seleccionados por el usuario. Así que cuando hay un disparador, remito primero mi lista y sólo agrego un ítem si no estaba ya presente en la lista, de lo contrario ignoro la devolución de llamada.
@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; }
La mayoría de estos están demasiado involucrados (pero funcionan). Todo lo que intenta hacer es detener el evento .setChecked al disparar si se está cargando la vista y establecer el estado marcado. Por lo tanto, establezca una variable de clase local isLoading, establezca en true al principio de getView y defínalo en false al final de getView. A continuación, en el oyente de clics, compruebe 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 } } });
El OnClickListener se ha trabajado para mí con el mismo problema y puedo enviar un dato a otra actividad
Holder.cks.setOnClickListener (new 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); } });