you with studio should provide missing labelfor edittext attribute android listview checkbox scroll

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



no label views point to this text field with an android labelfor @+id edittext attribute (7)

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:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/TextView01" android:layout_height="wrap_content" android:text="List of items" android:textStyle="normal|bold" android:gravity="center_vertical|center_horizontal" android:layout_width="fill_parent"/> <ListView android:id="@+id/ListView01" android:layout_height="250px" android:layout_width="fill_parent"/> <Button android:text="Save" android:id="@+id/btnSave" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>

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

listview.xml:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="wrap_content" android:gravity="left|center" android:layout_width="wrap_content" android:paddingBottom="5px" android:paddingTop="5px" android:paddingLeft="5px"> <TextView android:id="@+id/TextView01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:textColor="#FFFF00" android:text="hi"/> <TextView android:text="hello" android:id="@+id/TextView02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10px" android:textColor="#0099CC"/> <EditText android:id="@+id/txtbox" android:layout_width="120px" android:layout_height="wrap_content" android:textSize="12sp" android:layout_x="211px" android:layout_y="13px"/> <CheckBox android:id="@+id/chkbox1" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>

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 casilla de verificación mientras se desplaza hacia arriba y hacia abajo.


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 casilla de verificación 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 casilla de verificación. Puede consultar este link para hacerse una idea


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.


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)


Puede usar el siguiente código de adaptador para ejecutar una casilla de verificación 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<Model> modelArrayList; public CustomAdapter(Context context, ArrayList<Model> 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; } }


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 this te ayudará: D