简体   繁体   English

如何在BaseAdapter中以编程方式设置ListView项

[英]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 这是我的CustomAdapter,它扩展了BaseAdpater,当我运行应用程序时,出现错误

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. 我正在尝试实施类似http://www.androprogrammer.com/2013/10/list-view-with-check-box-using-custom.html的方法,但我无法判断出做错了什么。

here is my ContactModel 这是我的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. 无需再使用一个boolean数组来维护已检查的状态。 You can achieve the same thing by taking one more variable in your ContactModel as public boolean checked; 您可以通过将ContactModel另一个变量作为public boolean checked;来实现同一目的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();
     }
  });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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