Check box in list does not work properly

I check the list box for each list from the Iten list. The problem I get is when I click on any one checkbox, and when I look at some other checkboxes that don't click, they also click randomly. I went through many references to SO, but this did not solve my problem.

public class CustomListViewAdapter extends ArrayAdapter<Client> { ViewHolder holder = null; private LayoutInflater inflator = null; private ArrayList<Client> orderList = null; ArrayList<View> allViews; public CustomListViewAdapter(Context context, int resource, List<Client> objects) { super(context, resource, objects); orderList = (ArrayList<Client>) objects; inflator = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); allViews = new ArrayList<View>(); } @Override public View getView(int position, View convertView, ViewGroup parent) { if(convertView == null) { convertView = inflator.inflate(R.layout.listview_add_order, null); holder = new ViewHolder(); convertView.setTag(holder); holder.txtViewName = (TextView) convertView.findViewById(R.id.txtViewAddOrder); holder.spinnerAddorder = (Spinner) convertView.findViewById(R.id.spinnerAddOrder); holder.checkAddorder = (CheckBox) convertView.findViewById(R.id.checkAddOrder); holder.checkAddorder.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); holder.checkAddorder.setTag(holder); } allViews.add(position, holder.spinnerAddorder); holder.checkAddorder.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { CheckBox cchk = (CheckBox)view; ViewHolder checkPosition = (ViewHolder) view.getTag(); if(cchk.isChecked()) { checkPosition.spinnerAddorder.setVisibility(View.VISIBLE); } else { checkPosition.spinnerAddorder.setVisibility(View.INVISIBLE); } } }); List<String> list = new ArrayList<String>(); list.add("Select Quantity"); list.add("1"); list.add("2"); list.add("3"); ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this.getContext(),R.layout.spinner_add_order_style, list); dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_item); holder.spinnerAddorder.setAdapter(dataAdapter); if(holder.checkAddorder.isChecked()) { ViewHolder checkPosition = (ViewHolder) holder.checkAddorder.getTag(); checkPosition.spinnerAddorder.setVisibility(View.VISIBLE); } else { ViewHolder checkPosition = (ViewHolder) holder.checkAddorder.getTag(); checkPosition.spinnerAddorder.setVisibility(View.INVISIBLE); } Client order = orderList.get(position); holder.txtViewName.setText(order.getFirstName()); return convertView; } private static class ViewHolder { public TextView txtViewName = null; public Spinner spinnerAddorder = null; public CheckBox checkAddorder = null; } } 

my xml file

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:orientation="horizontal" android:paddingLeft="5dp" android:paddingRight="5dp" android:weightSum="2" > <TextView android:id="@+id/txtViewAddOrder" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1.2" android:text="TextView" android:textSize="25sp" /> <Spinner android:id="@+id/spinnerAddOrder" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight=".8" android:background="@drawable/dropdown" /> <CheckBox android:id="@+id/checkAddOrder" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" /> </LinearLayout> 
+2
source share
2 answers

This is due to the recirculation of the species. What you need to do is maintain the say booleans array and each time the checkbox is selected to switch the corresponding boolean. Then in your getview, check the corresponding position of the boolean array and set the state of the checkbox.

On these lines: I changed it so that it displays correctly. I did not check how much your code remained. ^ _ ^

 public class CustomListViewAdapter extends ArrayAdapter<Client> { ViewHolder holder = null; private LayoutInflater inflator = null; private ArrayList<Client> orderList = null; ArrayList<View> allViews; boolean[] checkedStates; //********** NEW ******** public CustomListViewAdapter(Context context, int resource, List<Client> objects) { super(context, resource, objects); orderList = (ArrayList<Client>) objects; inflator = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); allViews = new ArrayList<View>(); checkedStates = new boolean[objects.size()]; //********** NEW ******** } @Override //********** NEW ******** position argument is now final public View getView(final int position, View convertView, ViewGroup parent) { if(convertView == null) { convertView = inflator.inflate(R.layout.listview_add_order, null); holder = new ViewHolder(); convertView.setTag(holder); holder.txtViewName = (TextView) convertView.findViewById(R.id.txtViewAddOrder); holder.spinnerAddorder = (Spinner) convertView.findViewById(R.id.spinnerAddOrder); holder.checkAddorder = (CheckBox) convertView.findViewById(R.id.checkAddOrder); holder.checkAddorder.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); holder.checkAddorder.setTag(holder); } allViews.add(position, holder.spinnerAddorder); holder.checkAddorder.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { checkedStates[position] = !checkedStates[position]; //********** NEW ******** } }); holder.chechAddorder.setChecked(checkedStates[position]); //********** NEW ******** List<String> list = new ArrayList<String>(); list.add("Select Quantity"); list.add("1"); list.add("2"); list.add("3"); ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this.getContext(),R.layout.spinner_add_order_style, list); dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_item); holder.spinnerAddorder.setAdapter(dataAdapter); if(checkedStates[position]) { //********** NEWEST ******** assuming true is checked and false is unchecked ViewHolder checkPosition = (ViewHolder) holder.checkAddorder.getTag(); checkPosition.spinnerAddorder.setVisibility(View.VISIBLE); } else { ViewHolder checkPosition = (ViewHolder) holder.checkAddorder.getTag(); checkPosition.spinnerAddorder.setVisibility(View.INVISIBLE); } Client order = orderList.get(position); holder.txtViewName.setText(order.getFirstName()); return convertView; } private static class ViewHolder { public TextView txtViewName = null; public Spinner spinnerAddorder = null; public CheckBox checkAddorder = null; } } 
+3
source

Just set the focused property = false. make onClickListener on the CheckBox in the adapter.

 { <CheckBox android:id="@+id/cb_alert" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="5dip" android:button="@drawable/custom_checkbox" android:checked="true" android:focusable="false" android:padding="7dip" />} 
0
source

Source: https://habr.com/ru/post/945555/


All Articles