如何选择从ArrayList中填充Android的列表视图多个项目 [英] how to select multiple items in a listview populated from ArrayList in Android

查看:118
本文介绍了如何选择从ArrayList中填充Android的列表视图多个项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图写一个程序来选择列表视图我填充多个项目。但我有选择多个项目的难度。请让我知道如何做到这一点。贝娄是我怎么也填充ArrayList和我有一个自定义行使用复选框。我需要得到按钮单击事件选定的项目(名称,编号)。先感谢您。我试图了解其他职位,但因为我无法将它们与我的code,我不知道怎么办。

 公共类Contactselect延伸活动{

    ListView的LV;
    的EditText等;
    诠释计数;
    ArrayList的< HashMap的<字符串,字符串>>名单=新的ArrayList< HashMap的<字符串,字符串>>();
    字符串phoneNumber的;
    字符串名称;

    字符串名称=联系;
    字符串手机=PHONENUMBER;

    TextWatcher搜索;
    SimpleAdapter适配器;

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.contacts);

        listcontacts();

        LV =(ListView控件)findViewById(R.id.contactlist);
        lv.setChoiceMode(lv.CHOICE_MODE_MULTIPLE);
        lv.setTextFilterEnabled(真正的);
        适配器=新SimpleAdapter(这一点,列表,R.layout.row,新的String [] {
                姓名,电话},新的INT [] {R.id.names,R.id.numbers});

        lv.setAdapter(适配器);

        按钮B =(按钮)findViewById(R.id.done);
        b.setOnClickListener(新Button.OnClickListener(){

            @覆盖
            公共无效的onClick(视图v){

                字符串选择=;
                INT cntChoice = lv.getCount();

                SparseBooleanArray sparseBooleanArray = LV
                        .getCheckedItemPositions();
                的for(int i = 0; I< cntChoice;我++){
                    如果(sparseBooleanArray.get(i))的{
                        选择+ = lv.getItemAtPosition(I)的ToString()+\ N的;

                    }

                }

                Toast.makeText(Contactselect.this,选择,Toast.LENGTH_LONG)
                        。显示();

            }
        });

        等=(EditText上)findViewById(R.id.search);
        et.addTextChangedListener(新TextWatcher(){

            @覆盖
            公共无效onTextChanged(CharSequence的CS,诠释ARG1,INT ARG2,
                    INT ARG3){
                // TODO自动生成方法存根
                。Contactselect.this.adapter.getFilter()过滤器(CS);
            }

            @覆盖
            公共无效beforeTextChanged(CharSequence的arg0中,INT ARG1,
                    INT ARG2,诠释ARG3){
                // TODO自动生成方法存根

            }

            @覆盖
            公共无效afterTextChanged(编辑为arg0){
                // TODO自动生成方法存根

            }
        });

    }

    私人的ArrayList< HashMap的<字符串,字符串>> listcontacts(){
        // TODO自动生成方法存根
        的FileInputStream FIS = NULL;
        尝试 {
            FIS = openFileInput(contacts.xml);
        }赶上(FileNotFoundException异常E){
            // TODO自动生成的catch块
            e.printStackTrace();
        }
        尝试 {
            XmlPullParserFactory厂;

            工厂= XmlPullParserFactory.newInstance();

            factory.setNamespaceAware(真正的);
            XmlPullParser解析器= factory.newPullParser();
            parser.setInput(新的InputStreamReader(FIS));
            INT EVENTTYPE = parser.getEventType();
            INT O = 0;
            而(EVENTTYPE!= XmlPullParser.END_DOCUMENT){

                HashMap的<字符串,字符串>图=新的HashMap<字符串,字符串>();

                //设置标志主要标签。
                如果(EVENTTYPE == XmlPullParser.START_DOCUMENT){

                }否则,如果(EVENTTYPE == XmlPullParser.START_TAG){
                    串TAG_NAME = parser.getName();
                    如果(tag_name.contains(接触)){
                        // Log.i(标签,
                        // 名称
                        // +将String.valueOf(分析器
                        // .getAttributeValue(0))
                        // +......................
                        // +号
                        // +将String.valueOf(分析器
                        // .getAttributeValue(1)));
                        NAME =将String.valueOf(parser.getAttributeValue(0));
                        phoneNumber的=将String.valueOf(分析器
                                .getAttributeValue(1));

                        Log.i(姓名,phoneNumber的);
                        map.put(名称,姓名);
                        map.put(电话,phoneNumber的);

                        list.add(图)
                        算上++;

                    }
                }
                尝试 {
                    EVENTTYPE = parser.next();
                }赶上(IOException异常E){
                    // TODO自动生成的catch块
                    e.printStackTrace();
                }
            }
            Log.i(最终文件,端+计);
        }赶上(XmlPullParserException E){
            // TODO自动生成的catch块
            e.printStackTrace();
        }
        返回列表;
    }

}
 

解决方案

试试这个办法,希望这将帮助你解决你的问题。

 公共类Contactselect延伸活动{

    私人的ListView LV;
    私人的EditText等;
    私人键b;
    私人诠释计数;
    私人字符串名称=联系;
    私人字符串电话=PHONENUMBER;
    私人字符串IsSelected =isSelected;
    私人的ArrayList< HashMap的<字符串,字符串>>名单=新的ArrayList< HashMap的<字符串,字符串>>();

    私人ContactAdapter适配器;

    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);
        LV =(ListView控件)findViewById(R.id.contactlist);
        lv.setTextFilterEnabled(真正的);
        等=(EditText上)findViewById(R.id.search);
        B =(按钮)findViewById(R.id.done);

        listcontacts();
        适配器=新ContactAdapter(这一点,清单);
        lv.setAdapter(适配器);


        b.setOnClickListener(新Button.OnClickListener(){

            @覆盖
            公共无效的onClick(视图v){
                字符串选择=;
                对(HashMap的<字符串,字符串>行:名单){
                    如果(row.get(IsSelected).equals(真)){
                        选择+ = row.get(名称)+\ N的;
                    }
                }
                Toast.makeText(Contactselect.this,选择,Toast.LENGTH_LONG)
                        。显示();

            }
        });


        et.addTextChangedListener(新TextWatcher(){

            @覆盖
            公共无效onTextChanged(CharSequence的CS,诠释ARG1,诠释ARG2,诠释ARG3){
                adapter.filter(cs.toString());
            }

            @覆盖
            公共无效beforeTextChanged(CharSequence的arg0中,诠释ARG1,诠释ARG2,诠释ARG3){

            }

            @覆盖
            公共无效afterTextChanged(编辑为arg0){

            }
        });
    }

    私人无效listcontacts(){
        的FileInputStream FIS = NULL;
        尝试 {
            FIS = openFileInput(contacts.xml);
        }赶上(FileNotFoundException异常E){
            e.printStackTrace();
        }
        尝试 {
            XmlPullParserFactory厂;

            工厂= XmlPullParserFactory.newInstance();

            factory.setNamespaceAware(真正的);
            XmlPullParser解析器= factory.newPullParser();
            parser.setInput(新的InputStreamReader(FIS));
            INT EVENTTYPE = parser.getEventType();
            INT O = 0;
            而(EVENTTYPE!= XmlPullParser.END_DOCUMENT){

                HashMap的<字符串,字符串>图=新的HashMap<字符串,字符串>();

                //设置标志主要标签。
                如果(EVENTTYPE == XmlPullParser.START_DOCUMENT){

                }否则,如果(EVENTTYPE == XmlPullParser.START_TAG){
                    串TAG_NAME = parser.getName();
                    如果(tag_name.contains(接触)){
                        // Log.i(标签,
                        // 名称
                        // +将String.valueOf(分析器
                        // .getAttributeValue(0))
                        // +......................
                        // +号
                        // +将String.valueOf(分析器
                        // .getAttributeValue(1)));
                        Log.i(姓名,phoneNumber的);
                        map.put(名称,将String.valueOf(parser.getAttributeValue(0)));
                        map.put(电话,将String.valueOf(分析器
                                .getAttributeValue(1)));
                        map.put(IsSelected,假);

                        list.add(图)
                        算上++;

                    }
                }
                尝试 {
                    EVENTTYPE = parser.next();
                }赶上(IOException异常E){
                    e.printStackTrace();
                }
            }
            Log.i(最终文件,端+计);
        }赶上(XmlPullParserException E){
            e.printStackTrace();
        }
    }

    类ContactAdapter扩展了BaseAdapter {

        私人上下文的背景下;
        私人的ArrayList< HashMap的<字符串,字符串>>联系人;

        公共ContactAdapter(上下文的背景下,ArrayList的< HashMap的<字符串,字符串>>联系人){
            this.context =背景;
            this.contacts =新的ArrayList< HashMap的<字符串,字符串>>();
            this.contacts.addAll(联系人);

        }

        @覆盖
        公众诠释getCount将(){
            返回contacts.size();
        }

        @覆盖
        公共对象的getItem(INT位置){
            返回contacts.get(位置);
        }

        @覆盖
        众长getItemId(INT位置){
            返回的位置;
        }

        @覆盖
        公共查看getView(最终诠释的立场,观点convertView,ViewGroup中父){
            最后ViewHolder持有人;

            如果(convertView == NULL){
                持有人=新ViewHolder();
                convertView = LayoutInflater.from(上下文).inflate(R.layout.row,NULL);
                holder.name =(TextView中)convertView.findViewById(R.id.name);
                holder.numbers =(TextView中)convertView.findViewById(R.id.numbers);
                holder.checkbox =(复选框)convertView.findViewById(R.id.checkbox);
                convertView.setTag(保持器);
            } 其他 {
                支架=(ViewHolder)convertView.getTag();
            }

            holder.name.setText(contacts.get(位置)获得(名称));
            holder.numbers.setText(contacts.get(位置)获得(电话));
            holder.checkbox.setOnCheckedChangeListener(新CompoundButton.OnCheckedChangeListener(){

                @覆盖
                公共无效onCheckedChanged(CompoundButton ButtonView,布尔器isChecked){
                    contacts.get(位置)。把(IsSelected,+器isChecked);
                    对(HashMap的<字符串,字符串>数据:名单){
                        如果(data.get(名称).equals(contacts.get(位置)获得(名称))){
                            data.put(IsSelected,contacts.get(位置)获得(IsSelected));
                            打破;
                        }
                    }
                    notifyDataSetChanged();

                }
            });

            如果(contacts.get(位置)获得(IsSelected)的ToString()。等于(假)){
                holder.checkbox.setChecked(假);
            } 其他 {
                holder.checkbox.setChecked(真正的);
            }

            返回convertView;
        }

        公共无效过滤器(字符串charText){
            contacts.clear();
            如果(charText.length()== 0){
                contacts.addAll(名单);
            } 其他 {
                对(HashMap的<字符串,字符串>联系人:名单){
                    如果(contact.get(名称).toLowerCase()。包括(charText.toLowerCase())){
                        contacts.add(接触);
                    }
                }
            }
            notifyDataSetChanged();
        }


        类ViewHolder {
            TextView的名称;
            TextView的数量;
            复选框复选框;
        }
    }
}
 

I am trying to write a program to select multiple items in the listview i populate. but I am having difficulty of selecting multiple items. Please let me know how to do it. Bellow is how i have populate the Arraylist and i have a custom row with checkbox. i need to get the selected items (name, number) on the button click event. Thank you in advance. I have tried to understand the other posts, but since i was unable to relate them to my code, i am not sure of how to do.

public class Contactselect extends Activity {

    ListView lv;
    EditText et;
    int count;
    ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
    String phoneNumber;
    String name;

    String Name = "Contact";
    String Phone = "Phonenumber";

    TextWatcher search;
    SimpleAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.contacts);

        listcontacts();

        lv = (ListView) findViewById(R.id.contactlist);
        lv.setChoiceMode(lv.CHOICE_MODE_MULTIPLE);
        lv.setTextFilterEnabled(true);
        adapter = new SimpleAdapter(this, list, R.layout.row, new String[] {
                Name, Phone }, new int[] { R.id.names, R.id.numbers });

        lv.setAdapter(adapter);

        Button b = (Button) findViewById(R.id.done);
        b.setOnClickListener(new Button.OnClickListener() {

            @Override
            public void onClick(View v) {

                String selected = "";
                int cntChoice = lv.getCount();

                SparseBooleanArray sparseBooleanArray = lv
                        .getCheckedItemPositions();
                for (int i = 0; i < cntChoice; i++) {
                    if (sparseBooleanArray.get(i)) {
                        selected += lv.getItemAtPosition(i).toString() + "\n";

                    }

                }

                Toast.makeText(Contactselect.this, selected, Toast.LENGTH_LONG)
                        .show();

            }
        });

        et = (EditText) findViewById(R.id.search);
        et.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence cs, int arg1, int arg2,
                    int arg3) {
                // TODO Auto-generated method stub
                Contactselect.this.adapter.getFilter().filter(cs);
            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1,
                    int arg2, int arg3) {
                // TODO Auto-generated method stub

            }

            @Override
            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub

            }
        });

    }

    private ArrayList<HashMap<String, String>> listcontacts() {
        // TODO Auto-generated method stub
        FileInputStream fis = null;
        try {
            fis = openFileInput("contacts.xml");
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            XmlPullParserFactory factory;

            factory = XmlPullParserFactory.newInstance();

            factory.setNamespaceAware(true);
            XmlPullParser parser = factory.newPullParser();
            parser.setInput(new InputStreamReader(fis));
            int eventType = parser.getEventType();
            int o = 0;
            while (eventType != XmlPullParser.END_DOCUMENT) {

                HashMap<String, String> map = new HashMap<String, String>();

                // set flags for main tags.
                if (eventType == XmlPullParser.START_DOCUMENT) {

                } else if (eventType == XmlPullParser.START_TAG) {
                    String tag_name = parser.getName();
                    if (tag_name.contains("contacts")) {
                        // Log.i("tag",
                        // "name"
                        // + String.valueOf(parser
                        // .getAttributeValue(0))
                        // + "......................"
                        // + "number"
                        // + String.valueOf(parser
                        // .getAttributeValue(1)));
                        name = String.valueOf(parser.getAttributeValue(0));
                        phoneNumber = String.valueOf(parser
                                .getAttributeValue(1));

                        Log.i(name, phoneNumber);
                        map.put(Name, name);
                        map.put(Phone, phoneNumber);

                        list.add(map);
                        count++;

                    }
                }
                try {
                    eventType = parser.next();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            Log.i("End document", "Ended" + count);
        } catch (XmlPullParserException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return list;
    }

}

解决方案

Try this way,hope this will help you to solve your problem.

public class Contactselect extends Activity {

    private ListView lv;
    private EditText et;
    private Button b;
    private int count;
    private String Name = "Contact";
    private String Phone = "Phonenumber";
    private String IsSelected = "isSelected";
    private ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();

    private ContactAdapter adapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv = (ListView) findViewById(R.id.contactlist);
        lv.setTextFilterEnabled(true);
        et = (EditText) findViewById(R.id.search);
        b = (Button) findViewById(R.id.done);

        listcontacts();
        adapter  = new ContactAdapter(this,list);
        lv.setAdapter(adapter);


        b.setOnClickListener(new Button.OnClickListener() {

            @Override
            public void onClick(View v) {
                String selected = "";
                for (HashMap<String,String> row : list){
                    if(row.get(IsSelected).equals("true")){
                        selected += row.get(Name) + "\n";
                    }
                }
                Toast.makeText(Contactselect.this, selected, Toast.LENGTH_LONG)
                        .show();

            }
        });


        et.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence cs, int arg1, int arg2,int arg3) {
                adapter.filter(cs.toString());
            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1,int arg2, int arg3) {

            }

            @Override
            public void afterTextChanged(Editable arg0) {

            }
        });
    }

    private void listcontacts() {
        FileInputStream fis = null;
        try {
            fis = openFileInput("contacts.xml");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        try {
            XmlPullParserFactory factory;

            factory = XmlPullParserFactory.newInstance();

            factory.setNamespaceAware(true);
            XmlPullParser parser = factory.newPullParser();
            parser.setInput(new InputStreamReader(fis));
            int eventType = parser.getEventType();
            int o = 0;
            while (eventType != XmlPullParser.END_DOCUMENT) {

                HashMap<String, String> map = new HashMap<String, String>();

                // set flags for main tags.
                if (eventType == XmlPullParser.START_DOCUMENT) {

                } else if (eventType == XmlPullParser.START_TAG) {
                    String tag_name = parser.getName();
                    if (tag_name.contains("contacts")) {
                        // Log.i("tag",
                        // "name"
                        // + String.valueOf(parser
                        // .getAttributeValue(0))
                        // + "......................"
                        // + "number"
                        // + String.valueOf(parser
                        // .getAttributeValue(1)));
                        Log.i(name, phoneNumber);
                        map.put(Name, String.valueOf(parser.getAttributeValue(0)));
                        map.put(Phone, String.valueOf(parser
                                .getAttributeValue(1)));
                        map.put(IsSelected,"false");

                        list.add(map);
                        count++;

                    }
                }
                try {
                    eventType = parser.next();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            Log.i("End document", "Ended" + count);
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }
    }

    class ContactAdapter extends BaseAdapter {

        private Context context;
        private ArrayList<HashMap<String,String>> contacts;

        public ContactAdapter(Context context,ArrayList<HashMap<String,String>> contacts) {
            this.context =context;
            this.contacts =new ArrayList<HashMap<String, String>>();
            this.contacts.addAll(contacts);

        }

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

        @Override
        public Object getItem(int position) {
            return contacts.get(position);
        }

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

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            final ViewHolder holder;

            if (convertView == null) {
                holder      = new ViewHolder();
                convertView = LayoutInflater.from(context).inflate(R.layout.row, null);
                holder.name      = (TextView) convertView.findViewById(R.id.name);
                holder.numbers   = (TextView) convertView.findViewById(R.id.numbers);
                holder.checkbox      = (CheckBox) convertView.findViewById(R.id.checkbox);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            holder.name.setText(contacts.get(position).get(Name));
            holder.numbers.setText(contacts.get(position).get(Phone));
            holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton ButtonView, boolean isChecked) {
                    contacts.get(position).put(IsSelected, "" + isChecked);
                    for (HashMap<String,String> data : list){
                        if(data.get(Name).equals(contacts.get(position).get(Name))){
                            data.put(IsSelected,contacts.get(position).get(IsSelected));
                            break;
                        }
                    }
                    notifyDataSetChanged();

                }
            });

            if (contacts.get(position).get(IsSelected).toString().equals("false")) {
                holder.checkbox.setChecked(false);
            } else {
                holder.checkbox.setChecked(true);
            }

            return convertView;
        }

        public void filter(String charText) {
            contacts.clear();
            if (charText.length() == 0) {
                contacts.addAll(list);
            } else {
                for (HashMap<String,String> contact : list) {
                    if (contact.get(Name).toLowerCase().contains(charText.toLowerCase())) {
                        contacts.add(contact);
                    }
                }
            }
            notifyDataSetChanged();
        }


        class ViewHolder {
            TextView  name;
            TextView  number;
            CheckBox checkbox;
        }
    }
}

这篇关于如何选择从ArrayList中填充Android的列表视图多个项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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