verificacion trucos sheets hoja google formato docs contar condiciones condicional comandos casillas casilla calculo android listview baseadapter android-checkbox

android - trucos - Desplazar la casilla de verificación seleccionada sin marcar usando listiview



formato condicional google sheets (3)

El problema está en su método getView (). Estableces OnCheckedChangeListener y luego configuras la casilla de verificación en verdadero o falso, que activa la devolución de llamada en ese oyente. Primero debe establecer el estado de verificación de casilla de verificación y luego establecer OnCheckedChangeListener .

Además, ese campo booleano checked [] es inútil, así que simplifiqué un poco tu código:

public class CustomAdapter extends BaseAdapter { private final LayoutInflater inflater; private final Context context; private List<ModelPooja> listData; public CustomAdapter(Context mainActivity, List<ModelPooja> listData) { context = mainActivity; this.listData = listData; inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { return listData.size(); } @Override public Object getItem(int position) { return listData.get(position); } @Override public long getItemId(int position) { return 0; } @Override public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); convertView = inflater.inflate(R.layout.list_item_poojaselection, null); holder.tv = (TextView) convertView.findViewById(R.id.list_item_poojaname); holder.checks = (CheckBox) convertView.findViewById(R.id.list_item_poojacheck); convertView.setTag(holder); }else { holder = (ViewHolder) convertView.getTag(); } holder.checks.setOnCheckedChangeListener(null); holder.checks.setFocusable(false); if (listData.get(position).isselected) { holder.checks.setChecked(true); } else { holder.checks.setChecked(false); } holder.checks.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton cb, boolean b) { if (checkMaxLimit()) { if (listData.get(position).isselected && b) { holder.checks.setChecked(false); listData.get(position).isselected = false; } else { holder.checks.setChecked(false); listData.get(position).isselected = false; Toast.makeText(context, "Max limit reached", Toast.LENGTH_SHORT).show(); } } else { if (b) { listData.get(position).isselected = true; } else { listData.get(position).isselected = false; } } } }); holder.tv.setText(listData.get(position).getPOOJA_LISTING_NAME()); return convertView; } public boolean checkMaxLimit() { int countermax = 0; for(ModelPooja item : listData){ if(item.isselected){ countermax++; } } return countermax >= 5; } public class ViewHolder { TextView tv; public CheckBox checks; } }

En mi aplicación agregué la checkbox con ListView , y también puse una limitación para la checkbox de checkbox , el usuario no puede seleccionar más de 5 checkbox de checkbox , pero el problema está en desplazar mi checkbox seleccionada desmarcada después de mi código de fragmento, ¿alguien me puede ayudar con esto?

public class CustomAdapter extends BaseAdapter { private LayoutInflater inflater = null; Context context; String rup = "/u20B9"; private ArrayList<ModelPooja> listData; boolean checked[]; public CustomAdapterPooja(Context mainActivity, ArrayList<ModelPooja> listData) { // TODO Auto-generated constructor stub context = mainActivity; this.listData = listData; inflater = (LayoutInflater) context. getSystemService(Context.LAYOUT_INFLATER_SERVICE); checked = new boolean[listData.size()]; for (int i = 0; i < checked.length; i++) { checked[i] = listData.get(i).isselected; } } @Override public int getCount() { // TODO Auto-generated method stub return listData.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub final ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); convertView = inflater.inflate(R.layout.list_item_poojaselection, null); holder.tv = (TextView) convertView.findViewById(R.id.list_item_poojaname); holder.serviceprice = (TextView) convertView.findViewById(R.id.list_item_poojaprice); holder.dayss = (TextView) convertView.findViewById(R.id.list_item_poojadays); holder.txtseledates = (TextView) convertView.findViewById(R.id.selecteddatess); holder.checks = (CheckBox) convertView.findViewById(R.id.list_item_poojacheck); convertView.setTag(holder); }else { holder = (ViewHolder) convertView.getTag(); } holder.checks.setOnCheckedChangeListener(null); holder.checks.setFocusable(false); holder.checks.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton cb, boolean b) { if (checkMaxLimit()) { if (listData.get(position).isselected && b) { holder.checks.setChecked(false); listData.get(position).isselected = false; } else { holder.checks.setChecked(false); listData.get(position).isselected = false; Toast.makeText(context, "Max limit reached", Toast.LENGTH_SHORT).show(); } } else { if (b) { listData.get(position).isselected = true; } else { listData.get(position).isselected = false; } } } }); if (listData.get(position).isselected()) { holder.checks.setChecked(true); } else { holder.checks.setChecked(false); } holder.tv.setText(listData.get(position).getPOOJA_LISTING_NAME()); holder.dayss.setText(listData.get(position).getPOOJA_LISTING_DAYS()); holder.serviceprice.setText(rup + listData.get(position).getPOOJA_LISTING_AMOUNT()); return convertView; } public boolean checkMaxLimit() { int countermax = 0; for (int i = 0; i < checked.length; i++) { checked[i] = false; checked[i] = listData.get(i).isselected(); if (listData.get(i).isselected()) { countermax++; } } return countermax >= 5 ? true : false; } public class ViewHolder { TextView tv; TextView serviceprice; public CheckBox checks; public TextView dayss; public TextView txtseledates; } }


Esto se debe a que cuando desplaza su vista de lista desde el lado superior o inferior del teléfono, todos los elementos de la vista de lista se regeneran y se establecen en el valor predeterminado. Para evitar esto, crea una clase de modelo que contenga el valor actual de la casilla de verificación (verdadera o falsa) y establece el valor de casilla de verificación en el adaptador llamando al método getter desde esa instancia de modelo. Por ejemplo:

modelo.java

public class AddressModel { private boolean isChecked; private String address; private int alAddressDelete; public AddressModel(){ } public AddressModel(boolean isChecked, String address, int alAddressDelete) { this.isChecked = isChecked; this.address = address; this.alAddressDelete = alAddressDelete; } public boolean getIsChecked() { return isChecked; } public void setIsChecked(boolean isChecked) { this.isChecked = isChecked; } }

En su clase Adapter, establezca el valor de checkbox llamando a setIsChecked(boolean isChecked) en setOnCheckedChangeListener() . llame a getIsChecked() donde está configurando el valor de sus casillas de verificación.


Haga una matriz booleana inicialmente con valor falso en el adaptador. Si el usuario verifica la matriz, haga que la posición de la matriz sea verdadera. Al desmarcar hazlo falso. Siempre configure el valor de la casilla de verificación de esa matriz booleana.