简体   繁体   中英

How to set a ListView Item as checked programmatically in a BaseAdapter

Here is my CustomAdapter which extends the BaseAdpater When i run the app i get the error

FATAL EXCEPTION: main
java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
        at com.africacloudspace.apps.mobisms.adapters

This is the custom adapter

public class ContactCustomAdapter extends BaseAdapter {

    private Activity activity;
    private LayoutInflater inflater;
    private List<ContactModel> contactModels;
    boolean[] itemChecked;

    public ContactCustomAdapter(Activity activity, List<ContactModel> contactModels) {
        this.activity = activity;
        this.contactModels = contactModels;
        itemChecked = new boolean[contactModels.size()];
    }

    @Override
    public int getCount() {
        return contactModels.size();
    }

    @Override
    public Object getItem(int location) {
        return contactModels.get(location);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    private int lastPosition = -1;

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolderContacts viewHolderContacts;
        if (inflater == null)
            inflater = (LayoutInflater) activity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.contact_item_model, null);
            viewHolderContacts = new ViewHolderContacts();

            viewHolderContacts.contact_id = (TextView) convertView.findViewById(R.id.item_contact_id);
            viewHolderContacts.contact_fname = (TextView) convertView.findViewById(R.id.item_contact_fname);
            viewHolderContacts.contact_lname = (TextView) convertView.findViewById(R.id.item_contact_lname);
            viewHolderContacts.contact_number = (TextView) convertView.findViewById(R.id.item_contact_number);
            viewHolderContacts.ckbox2 = (CheckBox) convertView.findViewById(R.id.checkbox_contact);

            convertView.setTag(viewHolderContacts);

        } else {
            viewHolderContacts = (ViewHolderContacts) convertView.getTag();
        }

        ContactModel c = contactModels.get(position);
        viewHolderContacts.contact_id.setText(c.getContactId());
        viewHolderContacts.contact_fname.setText(c.getFirstName());
        viewHolderContacts.contact_lname.setText(c.getLastName());
        viewHolderContacts.contact_number.setText(c.getNumber());
        viewHolderContacts.ckbox2.setChecked(false);

        if (itemChecked[position]) {
            viewHolderContacts.ckbox2.setChecked(true);
        } else {
            viewHolderContacts.ckbox2.setChecked(false);
        }

    /* animate the list items */
        Animation animation = AnimationUtils.loadAnimation(parent.getContext(), (position > lastPosition) ? R.anim.list_up_from_bottom : R.anim.list_down_from_top);
        convertView.startAnimation(animation);
        lastPosition = position;

        return convertView;

    }

    private class ViewHolderContacts {
        TextView contact_id;
        TextView contact_fname;
        TextView contact_lname;
        TextView contact_number;
        CheckBox ckbox2;
    }

}

When i remove this part from the code

if (itemChecked[position]) {
        viewHolderContacts.ckbox2.setChecked(true);
    } else {
        viewHolderContacts.ckbox2.setChecked(false);
    }

The error is gone

i have tried almost everything.. i really need some help

i am trying to implement something like this http://www.androprogrammer.com/2013/10/list-view-with-check-box-using-custom.html but i can't tell what am doing wrong.

here is my ContactModel

public class ContactModel {

public String contactId;
public String firstName;
public String lastName;
public String number;
public String email;
public String location;

public ContactModel() {
    super();
}

public void setContactId(String contactId) {
    this.contactId = contactId;
}

public String getContactId() {
    return contactId;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getFirstName() {
    return firstName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getLastName() {
    return lastName;
}

public void setNumber(String number) {
    this.number = number;
}

public String getNumber() {
    return number;
}

public void setEmail(String email) {
    this.email = email;
}

public String getEmail() {
    return email;
}

public void setLocation(String location) {
    this.location = location;
}

public String getLocation() {
    return location;
}

}

There is no need of taking one more boolean array to maintain the checked staus. You can achieve the same thing by taking one more variable in your ContactModel as public boolean checked;

Modify this

    if (itemChecked[position]) {
        viewHolderContacts.ckbox2.setChecked(true);
    } else {
        viewHolderContacts.ckbox2.setChecked(false);
    }

as

    ContactModel c = contactModels.get(position);

    viewHolderContacts.ckbox2.setChecked(c.checked);

Imeplement list item click listener as follows

  listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
     @Override
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        contactModels.get(position).checked = !contactModels.get(position).checked;
        adapter.notifyDataSetChanged();
     }
  });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM