0

When checkboxes are checked and text inserted into edittext in listvew they seem to migrate between listitems somewhat randomly both when scrolling and not scrolling.
I have tried to implement holders and other solutions that can be found in the following links but to no avail.

CheckBox in RecyclerView keeps on checking different items
Checking a checkbox in listview makes other random checkboxes checked too

Any and all suggestions on my predicament would be greatly appreciated.

Here is the code from the aforementioned program.

ItemAdapter

public class ItemAdapter extends ArrayAdapter<Item> {

public static boolean isitpopulated;
public static int DrawerInUse;
public static int ListLoc;


public ItemAdapter(Activity context, ArrayList<Item> items) {
    super(context, 0, items);
}

@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
    // Check if the existing view is being reused, otherwise inflate the view
    View listItemView = convertView;

    if (listItemView == null) {
        listItemView = LayoutInflater.from(getContext()).inflate(
                R.layout.list_item, parent, false);

    }
        // Get the {@link Item} object located at this position in the list
        final Item currentItem = getItem(position);
        final Item currentposs = getItem(position);

        // Find the TextView in the list_item.xml layout with the ID version_name
        TextView itemTextView = (TextView) listItemView.findViewById(R.id.item);

        CheckBox check = listItemView.findViewById(R.id.checkbox);

        final TextView quantityTextView = (TextView) listItemView.findViewById(R.id.quantity);
        String listcontent = quantityTextView.getText().toString();

        int drawer = Drawers.DrawerChosen;            

        // Get the version name from the current object and
        // set this text on the name TextView
        itemTextView.setText(currentItem.getItem());

        TextView infoTextView = (TextView) listItemView.findViewById(R.id.info);
        infoTextView.setText(currentItem.getInfo());

        TextView doseTextView = (TextView) listItemView.findViewById(R.id.dose);
        doseTextView.setText(currentItem.getDose());

        TextView typeTextView = (TextView) listItemView.findViewById(R.id.type);
        typeTextView.setText(currentItem.getType());
        // website with solution
        //https://stackoverflow.com/questions/11190390/checking-a-checkbox-in-listview-makes-other-random-checkboxes-checked-too

    if (listcontent.isEmpty()) {
            quantityTextView.setText(currentItem.getQuantity());

            System.out.println("Drawer: "+drawer+" Position: "+position);

            if (drawer < 9) {
                String Liststatus = ListProcessing.wagon[0][drawer][position][5];
                if (Liststatus.equals("true")) {
                    // make box cheked
                    CheckBox checktemp = listItemView.findViewById(R.id.checkbox);
                    checktemp.setChecked(true);
                    System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: " + ListProcessing.wagon[0][drawer][position][5]);
                }
            }

            if (drawer == 10) {
            //String FListstatus = ListProcessing.finalWagon[position][5];
                /*
                if (FListstatus.equals("true")) {
                    CheckBox checktemp = listItemView.findViewById(R.id.checkbox);
                    checktemp.setChecked(true);
                    System.out.println("BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB");
                }
                */
            }

            // if(listcontent.isEmpty()) {
            //final CheckBox check = listItemView.findViewById(R.id.checkbox);

            final View listItemView1 = listItemView;

            //reset and Populating list
            final String itemName = currentposs.getItem();
            String itemInfo = currentposs.getInfo();
            String itemDose = currentposs.getDose();
            String itemQuantity = currentposs.getQuantity();
            String itemType = currentposs.getType();
            // populateList(position,itemName,itemInfo,itemDose,itemQuantity,itemType);

            // when chekbox is ticked then list is amended
            check.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    CheckBox checkBox = (CheckBox) v;
                    ListProcessing d = new ListProcessing();
                    if (checkBox.isChecked()) {

                        if (Drawers.DrawerChosen <= 10) {
                            d.wagon[0][Drawers.DrawerChosen][position][5] = "true";                                
                        } else if (Drawers.DrawerChosen == 10) {
                            d.finalWagon[position][5] = "true";
                        }
                    } else if (checkBox.isChecked() == false) {
                        if (Drawers.DrawerChosen < 10) {
                            d.wagon[0][Drawers.DrawerChosen][position][5] = "false";
                        } else if (Drawers.DrawerChosen == 10) {
                            d.finalWagon[position][5] = "false";
                        }
                    }
                }
            });

            final TextView quantityTextView1 = (TextView) listItemView1.findViewById(R.id.quantity);
            String userinput = quantityTextView1.getText().toString();
           listItemView.findViewById(R.id.quantity);
            quantityTextView1.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                    // System.out.println("!!!!!!!!!!!!!!!!!!!!!!beforeTextChanged!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
                }
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    //System.out.println("!!!!!!!!!!!!!!!!!!!!!!onTextChanged!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
                }

                //@Override
                public void afterTextChanged(Editable s) {
                    System.out.println("!!!!!!!!!!!!!!!!!!!!!!afterTextChanged!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
                    String numberInserted;
                    final View listItemView2 = listItemView1;
                    final TextView quantityTextView2 = (TextView) listItemView2.findViewById(R.id.quantity);
                    String userinput = quantityTextView2.getText().toString();
                    //System.out.println("user input: " + userinput + "-------------------------------");
                    //if (userinput.isEmpty()) {

                    int drawer = Drawers.DrawerChosen;
                    //ListProcessing.wagon[0][drawer][position][3] = userinput;
                    //System.out.println("ListProcessing.wagon[0]["+drawer+"]["+position+"][3]: " + ListProcessing.wagon[0][drawer][position][3] + "-------------------------------");
                    ListProcessing.ChangeData(drawer, position, userinput);
                }
            });
        }


        if (currentItem.isCheckBox()) {
            check.setVisibility(View.VISIBLE);
        } else {
            check.setVisibility(View.GONE);
        }

        if (currentItem.isInfo()) {
            infoTextView.setVisibility(View.VISIBLE);
        } else {
            infoTextView.setVisibility(View.GONE);
        }

        if (currentItem.isDose()) {
            doseTextView.setVisibility(View.VISIBLE);
        } else {
            doseTextView.setVisibility(View.GONE);
        }

        if (currentItem.isQuantity()) {
            quantityTextView.setVisibility(View.VISIBLE);
        } else {
            quantityTextView.setVisibility(View.GONE);
        }


    return listItemView;
}
}


package com.example.notandi.hospitalwagons;


Item

public class Item {

private String item;
private String info;
private String dose;
private String type;
private int quantity;
private int userQuantity;

private boolean isInfo = false;
private boolean isDose = false;
private boolean isQuantity = false;
private boolean isCheckBox = false;
public int itemChosen;

/**
 * @param wItem
 */

public Item(String wItem) {
    item = wItem;
    isCheckBox = true;
}


/**
 * @param wItem is the name of the item/medicine
 * @param wQuantity is how many items there should be total
 * @param wType ...
 */
public Item(String wItem, int wQuantity, String wType) {
    item = wItem;
    quantity = wQuantity;
    type = wType;
    isCheckBox = true;
    isQuantity = true;
}

public Item(String wItem, String wInfo, String wDose, int wQuantity, String wType) {
    item = wItem;
    info = wInfo;
    dose = wDose;
    quantity = wQuantity;
    type = wType;
    isCheckBox = true;
    isQuantity = true;
    isDose = true;
    isInfo = true;
}

public String getItem() {
    return item;
}

public String getInfo() {
    return info;
}

public String getDose() {
    return dose;
}

public String getType() {
    return type;
}

public String getQuantity() {
    return Integer.toString(quantity);
}

public boolean isCheckBox() {
    return isCheckBox;
}

public boolean isInfo() {
    return isInfo;
}

public boolean isDose() {
    return isDose;
}

public boolean isQuantity() {
    return isQuantity;
}

public void findViewById (int quantity) {
}
}

One of the many fragments

public class drawer_med_Fragment extends Fragment {

public int[] quantityArr;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.word_list, container, false);

    getActivity().setTitle(R.string.medicine_drawer);

    ArrayList<Item> items = new ArrayList<Item>();

    String[] itemArr = getResources().getStringArray(R.array.medicine_drawer_items);
    String[] infoArr = getResources().getStringArray(R.array.medicine_drawer_info);
    String[] doseArr = getResources().getStringArray(R.array.medicine_drawer_dose);
    String[] typeArr = getResources().getStringArray(R.array.medicine_drawer_type);
    int[] quantityArr= new int[26];
    for(int i=0;i<26;i++){
        int a = Integer.parseInt(ListProcessing.wagon[0][1][i][3]);
        quantityArr[i]=a;
        }

    String item;
    String info;
    String dose;
    String type;
    int quantity;

    for (int i = 0; i < itemArr.length; i++) {

        item = itemArr[i];
        info = infoArr[i];
        dose = doseArr[i];
        quantity = quantityArr[i];
        type = typeArr[i];
        items.add(new Item(item, info, dose, quantity, type));
    }

    ItemAdapter adapter = new ItemAdapter(getActivity(), items);

    ListView listView = (ListView) rootView.findViewById(R.id.list);

    listView.setAdapter(adapter);

    return rootView;
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    setRetainInstance(true);
}
//public void startlistTop(){
  //  quantityArr =  getResources().getIntArray(R.array.medicine_drawer_quantity);
//}
  }
Olaf
  • 31
  • 3

1 Answers1

2

The problem most likely in adapter. Every if statements you have to add else statements also. Something like that:

if (listcontent.isEmpty()) {
  quantityTextView.setText(currentItem.getQuantity());
} else {
  quantityTextView.setText("");
}

if (drawer < 9) {
...
} else {
...
}
oztrna
  • 95
  • 6