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