自定义的ListView多选 [英] Custom listView multiselection

查看:231
本文介绍了自定义的ListView多选的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我发展的地方的Listview多项选择是可能的,现在的问题是,当我滚动向下或向上项目的选择就会迷失方向和选择,除了选择一个在任何其他项目的。

I am developing Listview where Multiple selection is possible,now the problem is when i scroll down or up the selection of items get lost and selection made on any other item except the selected one.

下面是我的活动。

  public class ContactPickerActivity extends Activity {

    private ArrayList<Contact> arr = new ArrayList<Contact>();
    private Context context;
    private ListView list;
    private ContactArrayAdapter adapter;
    private String strName,strNumber;
    private View view;  
    public static ArrayList<Boolean> arrBoolean = new ArrayList<Boolean>();

    @Override
    public void onCreate(Bundle savedInstance) {
        super.onCreate(savedInstance);
        setContentView(R.layout.contact_picker);
        ProgressDialog pd  = new ProgressDialog(this);
        list = (ListView)findViewById(R.id.contactList);
        arr = new ArrayList<Contact>();
        context = ContactPickerActivity.this;
        arr =  displayContacts();
        Log.i("ContactPicker", "Completed Displaying Contact list ::: " + arr.size());
        adapter = new ContactArrayAdapter(this,arr);
        list.setAdapter(adapter);
//              list.setAdapter(new ArrayAdapter<String>(this,
//                      android.R.layout.simple_list_item_multiple_choice, listContent));
        list.setOnItemClickListener(ContactSelectedListener);
        Log.i("Boolaean >>> ", arrBoolean.size() + "");


    }

    private OnItemClickListener ContactSelectedListener = new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View arg1, int arg2,long arg3) {
            Log.i("ListViewTest","Item Click");
            SparseBooleanArray checked = list.getCheckedItemPositions();
            for (int i = 0; i < arr.size(); i++) {
                Log.i("ListViewTest", arr.get(i)+ ": " + checked.get(i));
            }
        }
    };

    private ArrayList<Contact> displayContacts() {

        ContentResolver cr = getContentResolver();
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null);
        Contact contact;
        if (cur.getCount() > 0) {
            while (cur.moveToNext()) {
                contact = new Contact();
                String id = cur.getString(cur.getColumnIndex(People._ID));
                String name = cur.getString(cur.getColumnIndex(People.DISPLAY_NAME));
                contact.setName(name);
                arr.add(contact);
            }
        }
        return arr;
    }
}
********* Adapter *****

public class ContactArrayAdapter extends BaseAdapter {

//  private final List<Contact> list;
    private Context context;    

    private LayoutInflater mInflater;
    private List<Contact> list; 

     public ContactArrayAdapter(Context context,ArrayList<Contact> arrPublicData) {

        this.mInflater = LayoutInflater.from(context);
        this.list = arrPublicData;
    }

    public int getCount() {
        return list.size();
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        final ViewHolder viewHolder;
        if (view == null) {         
            view = mInflater.inflate(R.layout.multiselect_row, null);
            viewHolder = new ViewHolder();
            viewHolder.text = (TextView) view.findViewById(R.id.txtItem);
            viewHolder.checkbox = (CheckBox) view.findViewById(R.id.chkItem);

            viewHolder.checkbox
            .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                    Contact element = (Contact) viewHolder.checkbox.getTag();
                    element.setSelected(buttonView.isChecked());
                    ContactPickerActivity.arrBoolean.add(buttonView.isChecked());
                    Log.i("Boolaean 123 >>> ", buttonView.isChecked() + "");
                }
            });
            view.setTag(viewHolder);
            viewHolder.checkbox.setTag(list.get(position));
        } else {
            viewHolder = (ViewHolder) view.getTag();
            ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position));
        }
        ViewHolder holder = (ViewHolder) view.getTag();
        holder.text.setText(list.get(position).getName());
        holder.checkbox.setChecked(list.get(position).isSelected());        
        return view;
    }

    static class ViewHolder {
    protected TextView text;
    protected CheckBox checkbox;
}

我不是能够得到物品托运....
任何帮助appericiated ...... thanx提前

i m not able to get Items checked.... Any Help is appericiated...Thanx in Advance

推荐答案

但问题是在你的getView方法,请更正此如下:

Problem is in your getView method, please correct this as follows:

    public class ContactPickerActivity extends Activity {

    private ArrayList<Contacts> arr = new ArrayList<Contacts>();
    private Context context;
    private ListView list;
    private ContactArrayAdapter adapter;
    private String strName,strNumber;
    private View view;  
    public static boolean[] arrBoolean = null;

    @Override
    public void onCreate(Bundle savedInstance) {
        super.onCreate(savedInstance);
        //setContentView(R.layout.contact_picker);
        ProgressDialog pd  = new ProgressDialog(this);
        list = (ListView)findViewById(R.id.contactList);
        arr = new ArrayList<Contact>();
        context = ContactPickerActivity.this;
        arr =  displayContacts();
        arrBoolean=new boolean[arr.size()];
        Arrays.fill(arrBoolean, false);
        Log.i("ContactPicker", "Completed Displaying Contact list ::: " + arr.size());
        adapter = new ContactArrayAdapter(this,arr);
        list.setAdapter(adapter);
//              list.setAdapter(new ArrayAdapter<String>(this,
//                      android.R.layout.simple_list_item_multiple_choice, listContent));
        list.setOnItemClickListener(ContactSelectedListener);
        Log.i("Boolaean >>> ", arrBoolean.size() + "");


    }

    private OnItemClickListener ContactSelectedListener = new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View arg1, int position,long arg3) {
            Log.i("ListViewTest","Item Click");
            arrBoolean[position]=!arrBoolean[position];
            adapter.notifyDataSetChanged();
        }
    };

    private ArrayList<Contacts> displayContacts() {

        ContentResolver cr = getContentResolver();
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null);
        Contacts contact;
        if (cur.getCount() > 0) {
            while (cur.moveToNext()) {
                contact = new Contacts();
                String id = cur.getString(cur.getColumnIndex(People._ID));
                String name = cur.getString(cur.getColumnIndex(People.DISPLAY_NAME));
                contact.setName(name);
                arr.add(contact);
            }
        }
        return arr;
    }
}
//********* Adapter *****

public class ContactArrayAdapter extends BaseAdapter {

//  private final List<Contact> list;
    private Context context;    

    private LayoutInflater mInflater;
    private List<Contacts> list; 

     public ContactArrayAdapter(Context context,ArrayList<Contact> arrPublicData) {

        this.mInflater = LayoutInflater.from(context);
        this.list = arrPublicData;
    }

    public int getCount() {
        return list.size();
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        final ViewHolder viewHolder;
        if (view == null) {         
            view = mInflater.inflate(R.layout.multiselect_row, null);
            viewHolder = new ViewHolder();
            viewHolder.text = (TextView) view.findViewById(R.id.txtItem);
            viewHolder.checkbox = (CheckBox) view.findViewById(R.id.chkItem);


            view.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) view.getTag();
        }
        ViewHolder holder = (ViewHolder) view.getTag();
        holder.text.setText(list.get(position).getName());
        holder.checkbox.setChecked(ContactPickerActivity.arrBoolean[position]);        
        return view;
    }

    static class ViewHolder {
    protected TextView text;
    protected CheckBox checkbox;
}

这篇关于自定义的ListView多选的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆