Выбран флажок Onscroll для снятия флажка с помощью listiview
В моем приложении я добавил checkbox
с ListView
, и я также дал ограничение для checkbox
, пользователь не может выбрать более 5 checkbox
, но проблема заключается в прокрутке моего выбранного checkbox
неконтролируемого следующий мой код фрагмента, может ли кто-нибудь помочь мне с этим
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;
}
}
Ответы
Ответ 1
Проблема в вашем методе getView(). Вы устанавливаете OnCheckedChangeListener, после чего установите флажок в true или false, который вызывает обратный вызов в этом прослушивателе. Вы должны установить состояние проверки флажка сначала, а после этого установите OnCheckedChangeListener.
Кроме того, это поле boolean checked [] бесполезно, поэтому я немного упростил ваш код:
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;
}
}
Ответ 2
Сначала создайте логический массив с ложным значением в адаптере. Если пользователь проверяет массив, установите позицию массива true. Снимите флажок, чтобы сделать его ложным. Всегда устанавливайте значение флажка из этого логического массива.
Ответ 3
Это связано с тем, что при прокрутке списка с верхней или нижней стороны телефона все элементы списка отображаются повторно, и для них установлено значение по умолчанию.
Чтобы избежать этого, создайте класс модели, который содержит текущее значение флажка (true или false) и установите значение флажка в адаптере, вызвав метод getter из экземпляра модели.
Например:
model.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;
}
}
В классе Adapter установите значение флажка, вызвав setIsChecked(boolean isChecked)
в setOnCheckedChangeListener()
.
вызовите getIsChecked()
, где вы устанавливаете значение своих флажков.
Ответ 4
Сначала вызовите setOnCheckedChangeListener()
, затем вызовите setChecked()
, в противном случае setChecked()
вызовет предыдущий объект ViewHolder setOnCheckedChangeListener()
.