Multiple Choice Searchable ListView

前端 未结 2 1927
清歌不尽
清歌不尽 2020-12-18 23:50

OK I have a multiple choice ListView that works fine. I check the boxes for the contacts (held in a String[]) and can return the values fine. Because some people have a bu

2条回答
  •  孤城傲影
    2020-12-19 00:05

    You can create android project and add these files:

    res/layout->list_row.xml

    
    
        
        
            
            
        
        
    
    

    res/layout->activity_main.xml

    
        
        
        

    ContactObject.java

    package com.multiselectlistexample;
    public class ContactObject {
    
        private String contactName;
        private String contactNo;
        private String image;
        private boolean selected;
        public String getName() {
            return contactName;
        }
        public void setName(String contactName) {
            this.contactName = contactName;
        }
        public String getNumber() {
            return contactNo;
        }
        public void setNumber(String contactNo) {
            this.contactNo = contactNo;
        }
        public String getImage() {
            return image;
        }
        public void setImage(String image) {
            this.image = image;
        }
        public boolean isSelected() {
            return selected;
        }
        public void setSelected(boolean selected) {
            this.selected = selected;
        }
    }
    

    ContactsListClass.java

    package com.multiselectlistexample;
    import java.util.ArrayList;
    public class ContactsListClass {
        public static final ArrayList phoneList = new ArrayList();
    }
    

    ContactsAdapter.java

    package com.multiselectlistexample;
    import java.io.ByteArrayInputStream;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Locale;
    import android.content.ContentUris;
    import android.content.Context;
    import android.database.Cursor;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.net.Uri;
    import android.provider.ContactsContract.Contacts;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.CheckBox;
    import android.widget.CompoundButton;
    import android.widget.ImageView;
    import android.widget.TextView;
    public class ContactsAdapter extends BaseAdapter {
        Context mContext;
        LayoutInflater inflater;
        private List mainDataList = null;
        private ArrayList arraylist;
        public ContactsAdapter(Context context, List mainDataList) {
    
            mContext = context;
            this.mainDataList = mainDataList;
            inflater = LayoutInflater.from(mContext);
            this.arraylist = new ArrayList();
            this.arraylist.addAll(mainDataList);
    
    
        }
        static class ViewHolder {
            protected TextView name;
            protected TextView number;
            protected CheckBox check;
            protected ImageView image;
        }
        @Override
        public int getCount() {
            return mainDataList.size();
        }
        @Override
        public ContactObject getItem(int position) {
            return mainDataList.get(position);
        }
        @Override
        public long getItemId(int position) {
            return position;
        }
        public View getView(final int position, View view, ViewGroup parent) {
            final ViewHolder holder;
            if (view == null) {
                holder = new ViewHolder();
                view = inflater.inflate(R.layout.list_row, null);
                holder.name = (TextView) view.findViewById(R.id.contactname);
                holder.number = (TextView) view.findViewById(R.id.contactno);
                holder.check = (CheckBox) view.findViewById(R.id.contactcheck);
                holder.image = (ImageView) view.findViewById(R.id.contactimage);
                view.setTag(holder);
                view.setTag(R.id.contactname, holder.name);
                view.setTag(R.id.contactno, holder.number);
                view.setTag(R.id.contactcheck, holder.check);
                holder.check
                        .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                            @Override
                            public void onCheckedChanged(CompoundButton vw,
                                    boolean isChecked) {
                                int getPosition = (Integer) vw.getTag();
                                mainDataList.get(getPosition).setSelected(
                                        vw.isChecked());
                            }
                        });
            } else {
                holder = (ViewHolder) view.getTag();
            }
            holder.check.setTag(position);
    
            holder.name.setText(mainDataList.get(position).getName());
            holder.number.setText(mainDataList.get(position).getNumber());
    
            if(getByteContactPhoto(mainDataList.get(position).getImage())==null){
                holder.image.setImageResource(R.drawable.ic_launcher);
            }else{
                holder.image.setImageBitmap(getByteContactPhoto(mainDataList.get(position).getImage()));
            }
    
    
    
            holder.check.setChecked(mainDataList.get(position).isSelected());
            return view;
        }
        public void filter(String charText) {
            charText = charText.toLowerCase(Locale.getDefault());
            mainDataList.clear();
            if (charText.length() == 0) {
                mainDataList.addAll(arraylist);
            } else {
                for (ContactObject wp : arraylist) {
                    if (wp.getName().toLowerCase(Locale.getDefault())
                            .contains(charText)) {
                        mainDataList.add(wp);
                    }
                }
            }
            notifyDataSetChanged();
        }
        public Bitmap getByteContactPhoto(String contactId) {
            Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, Long.parseLong(contactId));
            Uri photoUri = Uri.withAppendedPath(contactUri, Contacts.Photo.CONTENT_DIRECTORY);
            Cursor cursor = mContext.getContentResolver().query(photoUri,
                            new String[] {Contacts.Photo.DATA15}, null, null, null);
            if (cursor == null) {
                return null;
            }
            try {
                if (cursor.moveToFirst()) {
                    byte[] data = cursor.getBlob(0);
                    if (data != null) {
                        return BitmapFactory.decodeStream( new ByteArrayInputStream(data));
                    }
                }
            } finally {
                cursor.close();
            }
            return null;
            }
    
    }
    

    MainActivity.java

    package com.multiselectlistexample;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.Locale;
    import android.app.Activity;
    import android.content.Context;
    import android.database.Cursor;
    import android.os.Bundle;
    import android.provider.ContactsContract;
    import android.text.Editable;
    import android.text.TextUtils;
    import android.text.TextWatcher;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.EditText;
    import android.widget.LinearLayout;
    import android.widget.LinearLayout.LayoutParams;
    import android.widget.ListView;
    import android.widget.RelativeLayout;
    import android.widget.Toast;
    public class MainActivity extends Activity {
        Context context = null;
        ContactsAdapter objAdapter;
        ListView lv = null;
        EditText edtSearch = null;
        LinearLayout llContainer = null;
        Button btnOK = null;
        RelativeLayout rlPBContainer = null;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            context = this;
            setContentView(R.layout.activity_main);
            rlPBContainer = (RelativeLayout) findViewById(R.id.pbcontainer);
            edtSearch = (EditText) findViewById(R.id.input_search);
            llContainer = (LinearLayout) findViewById(R.id.data_container);
            btnOK = (Button) findViewById(R.id.ok_button);
            btnOK.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    getSelectedContacts();
                }
            });
            edtSearch.addTextChangedListener(new TextWatcher() {
                @Override
                public void onTextChanged(CharSequence cs, int arg1, int arg2,
                        int arg3) {
                    // When user changed the Text
                    String text = edtSearch.getText().toString()
                            .toLowerCase(Locale.getDefault());
                    objAdapter.filter(text);
                }
                @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
                }
            });
            addContactsInList();
        }
        private void getSelectedContacts() {
            // TODO Auto-generated method stub
            StringBuffer sb = new StringBuffer();
            for (ContactObject bean : ContactsListClass.phoneList) {
                if (bean.isSelected()) {
                    sb.append(bean.getName());
                    sb.append(",");
                }
            }
            String s = sb.toString().trim();
            if (TextUtils.isEmpty(s)) {
                Toast.makeText(context, "Select atleast one Contact",
                        Toast.LENGTH_SHORT).show();
            } else {
                s = s.substring(0, s.length() - 1);
                Toast.makeText(context, "Selected Contacts : " + s,
                        Toast.LENGTH_SHORT).show();
            }
        }
        private void addContactsInList() {
            // TODO Auto-generated method stub
            Thread thread = new Thread() {
                @Override
                public void run() {
                    showPB();
                    try {
                        Cursor phones = getContentResolver().query(
                                ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                                null, null, null, null);
                        try {
                            ContactsListClass.phoneList.clear();
                        } catch (Exception e) {
                        }
                        while (phones.moveToNext()) {
                            String phoneName = phones
                                    .getString(phones
                                            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                            String phoneNumber = phones
                                    .getString(phones
                                            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                            String phoneImage = phones
                                    .getString(phones
                                            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
    
                            ContactObject cp = new ContactObject();
    
    
                            cp.setName(phoneName);
                            cp.setNumber(phoneNumber);
                            cp.setImage(phoneImage);
                            ContactsListClass.phoneList.add(cp);
                        }
                        phones.close();
                        lv = new ListView(context);
                        lv.setLayoutParams(new LayoutParams(
                                LayoutParams.MATCH_PARENT,
                                LayoutParams.MATCH_PARENT));
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                // TODO Auto-generated method stub
                                llContainer.addView(lv);
                            }
                        });
                        Collections.sort(ContactsListClass.phoneList,
                                new Comparator() {
                                    @Override
                                    public int compare(ContactObject lhs,
                                            ContactObject rhs) {
                                        return lhs.getName().compareTo(
                                                rhs.getName());
                                    }
                                });
                        objAdapter = new ContactsAdapter(MainActivity.this,
                                ContactsListClass.phoneList);
                        lv.setAdapter(objAdapter);
                        lv.setOnItemClickListener(new OnItemClickListener() {
                            @Override
                            public void onItemClick(AdapterView parent,
                                    View view, int position, long id) {
                                CheckBox chk = (CheckBox) view
                                        .findViewById(R.id.contactcheck);
                                ContactObject bean = ContactsListClass.phoneList
                                        .get(position);
                                if (bean.isSelected()) {
                                    bean.setSelected(false);
                                    chk.setChecked(false);
                                } else {
                                    bean.setSelected(true);
                                    chk.setChecked(true);
                                }
                            }
                        });
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    hidePB();
                }
            };
            thread.start();
        }
        void showPB() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    rlPBContainer.setVisibility(View.VISIBLE);
                    edtSearch.setVisibility(View.GONE);
                    btnOK.setVisibility(View.GONE);
                }
            });
        }
        void hidePB() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    rlPBContainer.setVisibility(View.GONE);
                    edtSearch.setVisibility(View.VISIBLE);
                    btnOK.setVisibility(View.VISIBLE);
                }
            });
        }
    }
    

    AndroidManifest.xml

    
    
        
        
    
        
            
                
                    
                    
                
            
        
    
    

提交回复
热议问题