Casilla de verificación desmarcada cuando desplace la vista de lista en Android

Soy nuevo en el desarrollo de Android. listview una vista de lista con un textbox y una checkbox .

Cuando marque la checkbox y la desplace hacia abajo para verificar otros elementos en la vista de lista, los anteriores se desactivan.

¿Cómo evito este problema en una vista de lista? Por favor, guíame con mi código.

Aquí está el código:

main.xml:

     

Esta es la página XML que utilicé para crear una fila de lista dinámica:

listview.xml:

        

Esta es mi clase de actividad.

CustomListViewActivity.java:

 public class CustomListViewActivity extends Activity { ListView lstView; static Context mContext; Button btnSave; private static class EfficientAdapter extends BaseAdapter { private LayoutInflater mInflater; public EfficientAdapter(Context context) { mInflater = LayoutInflater.from(context); } public int getCount() { return country.length; } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.listview, parent, false); holder = new ViewHolder(); holder.text = (TextView) convertView .findViewById(R.id.TextView01); holder.text2 = (TextView) convertView .findViewById(R.id.TextView02); holder.txt = (EditText) convertView.findViewById(R.id.txtbox); holder.cbox = (CheckBox) convertView.findViewById(R.id.chkbox1); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.text.setText(curr[position]); holder.text2.setText(country[position]); holder.txt.setText(""); holder.cbox.setChecked(false); return convertView; } public class ViewHolder { TextView text; TextView text2; EditText txt; CheckBox cbox; } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); lstView = (ListView) findViewById(R.id.ListView01); lstView.setAdapter(new EfficientAdapter(this)); btnSave = (Button)findViewById(R.id.btnSave); mContext = this; btnSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // I want to print the text which is in the listview one by one. // Later I will insert it in the database. // // Toast.makeText(getBaseContext(), "EditText Value, checkbox value and other values", Toast.LENGTH_SHORT).show(); for (int i = 0; i < lstView.getCount(); i++) { View listOrderView; listOrderView = lstView.getChildAt(i); try{ EditText txtAmt = (EditText)listOrderView.findViewById(R.id.txtbox); CheckBox cbValue = (CheckBox)listOrderView.findViewById(R.id.chkbox1); if(cbValue.isChecked()== true){ String amt = txtAmt.getText().toString(); Toast.makeText(getBaseContext(), "Amount is :"+amt, Toast.LENGTH_SHORT).show(); } } catch (Exception e) { // TODO: handle exception } } } }); } private static final String[] country = { "item1", "item2", "item3", "item4", "item5", "item6","item7", "item8", "item9", "item10", "item11", "item12" }; private static final String[] curr = { "1", "2", "3", "4", "5", "6","7", "8", "9", "10", "11", "12" }; } 

Por favor ayúdame a resolver este problema.

Me he referido a este problema en muchos lugares. Pero no pude obtener la respuesta adecuada para resolver este problema.

Proporcione el código para evitar desmarcar la checkbox mientras se desplaza hacia arriba y hacia abajo.

En el adaptador de vista de lista personalizada, llame a setChecked después de llamar a setOnCheckedChangeListener .

De esta forma, corta el enlace al viejo oyente desde la vista reciclada.

Puede usar el siguiente código de adaptador para ejecutar una checkbox perfectamente en un ListView.

Una demostración detallada está aquí: Listview con Checkbox Android

Consulte el enlace de demostración detallado para obtener información detallada. También muestra cómo enviar información verificada a la siguiente actividad.

 import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.TextView; import android.widget.Toast; import java.util.ArrayList; public class CustomAdapter extends BaseAdapter { private Context context; public static ArrayList modelArrayList; public CustomAdapter(Context context, ArrayList modelArrayList) { this.context = context; this.modelArrayList = modelArrayList; } @Override public int getViewTypeCount() { return getCount(); } @Override public int getItemViewType(int position) { return position; } @Override public int getCount() { return modelArrayList.size(); } @Override public Object getItem(int position) { return modelArrayList.get(position); } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.lv_item, null, true); holder.checkBox = (CheckBox) convertView.findViewById(R.id.cb); holder.tvAnimal = (TextView) convertView.findViewById(R.id.animal); convertView.setTag(holder); } else { // The getTag returns the viewHolder object set as a tag to the view holder = (ViewHolder)convertView.getTag(); } holder.checkBox.setText("Checkbox " + position); holder.tvAnimal.setText(modelArrayList.get(position).getAnimal()); holder.checkBox.setChecked(modelArrayList.get(position).getSelected()); holder.checkBox.setTag(R.integer.btnplusview, convertView); holder.checkBox.setTag( position); holder.checkBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { View tempview = (View) holder.checkBox.getTag(R.integer.btnplusview); TextView tv = (TextView) tempview.findViewById(R.id.animal); Integer pos = (Integer) holder.checkBox.getTag(); Toast.makeText(context, "Checkbox " + pos + " clicked!", Toast.LENGTH_SHORT).show(); if (modelArrayList.get(pos).getSelected()){ modelArrayList.get(pos).setSelected(false); } else { modelArrayList.get(pos).setSelected(true); } } }); return convertView; } private class ViewHolder { protected CheckBox checkBox; private TextView tvAnimal; } } 

Model es

 public class Model { private boolean isSelected; private String animal; public String getAnimal() { return animal; } public void setAnimal(String animal) { this.animal = animal; } public boolean getSelected() { return isSelected; } public void setSelected(boolean selected) { isSelected = selected; } } 

En tu getView() tienes la siguiente línea

 holder.cbox.setChecked(false); 

que desactiva CheckBox cada vez que se llama a getView() (cuando desplazas tu lista, por ejemplo)

Blockquote

** En el método Side getView () simplemente llame así >>

 check.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton arg0, boolean arg1) { if(check.isChecked()) { //checked chkArray[position]=true; } else { //uncheck chkArray[position]=false; } } }); //check condition for checkboxes if(chkArray.length>0) { for (int i = 0; i < chkArray.length; i++) { if(chkArray[position]!=null && chkArray[position]) { check.setChecked(true); } } } 

Considerar:

 holder.cbox.setChecked(false); 

Eliminar esta linea Cuando desplazó la vista de lista cada vez, se llama al método getView ().

Cuando desplazamos elementos en listview, restaura el valor del adaptador. Es por eso que la checkbox no está marcada. Pero si actualizamos el adaptador con el último valor, permanecerá marcado. Para eso necesitas usar setOnClickListener ().

Todo lo que necesita hacer es actualizar su adaptador al hacer clic en la checkbox. Puede consultar este enlace para hacerse una idea

También tengo este problema antes. Android hace esto para ahorrar espacio; solo los elementos que ves actualmente están cargados, y esto es lo que descubrí.

Si usted está en la parte inferior de su lista, la identificación 1 está en la posición 5. Busqué en la web y descubrí esto antes.

Pero esto te ayudará: D