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.