Search code examples
androidandroid-listviewandroid-checkbox

Android: listview with checkbox issues


I have a LinearLayout where i am populating the phone contacts into the layout , now i am placing a checkbox , i want to implement multiple selection of checkboxes , i want to select multiple contacts and when i save (clicking save button) those contacts should be saved in my another layout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" 
    android:paddingTop="5dp"
    android:paddingBottom="5dp"
    android:id="@+id/profilelayout" >

     <ImageView
          android:id="@+id/photo"
          android:layout_width="68dp"
          android:layout_height="51dp" >
     </ImageView>

     <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

       <TextView android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="15dp"
        android:textStyle="bold"
        android:textColor="#000000"/>

       <CheckBox
           android:id="@+id/checkBox1"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"         
           android:layout_gravity="right"
           android:focusable="false"/>

      <TextView android:id="@+id/contactno"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#000000"
        />
      <TextView android:id="@+id/emailId"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#000000"
        />      

</LinearLayout>
</LinearLayout>

Any suggestions how can i achieve this and when i just checking the checkbox few other rows are also getting checked how to avoid this. Any help is appreciated.


Solution

  • Use this

       public class PlanetsActivity extends Activity {
        private ListView mainListView;
        private Contact[] contact_read;
        private Cursor mCursor;
        private ArrayAdapter<Contact> listAdapter;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        // Find the ListView resource.
        mainListView = (ListView) findViewById(R.id.mainListView);
    
        mainListView
                .setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View item,
                            int position, long id) {
                        Contact planet = listAdapter.getItem(position);
                        planet.toggleChecked();
                        ContactViewHolder viewHolder = (ContactViewHolder) item
                                .getTag();
                        viewHolder.getCheckBox().setChecked(planet.isChecked());
                    }
                });
    
        // Throw Query and fetch the contacts.
    
        String[] projection = new String[] { Contacts.HAS_PHONE_NUMBER,
                Contacts._ID, Contacts.DISPLAY_NAME };
    
        mCursor = managedQuery(Contacts.CONTENT_URI, projection,
                Contacts.HAS_PHONE_NUMBER + "=?", new String[] { "1" },
                Contacts.DISPLAY_NAME);
    
        if (mCursor != null) {
            mCursor.moveToFirst();
            contact_read = new Contact[mCursor.getCount()];
    
            // Add Contacts to the Array
    
            int j = 0;
            do {
    
                contact_read[j] = new Contact(mCursor.getString(mCursor
                        .getColumnIndex(Contacts.DISPLAY_NAME)));
                j++;
            } while (mCursor.moveToNext());
    
        } else {
            System.out.println("Cursor is NULL");
        }
    
        // Add Contact Class to the Arraylist
    
        ArrayList<Contact> planetList = new ArrayList<Contact>();
        planetList.addAll(Arrays.asList(contact_read));
    
        // Set our custom array adapter as the ListView's adapter.
        listAdapter = new ContactArrayAdapter(this, planetList);
        mainListView.setAdapter(listAdapter);
    }
    
        /** Holds Contact data. */
        @SuppressWarnings("unused")
        private static class Contact {
        private String name = "";
        private boolean checked = false;
    
        public Contact() {
        }
    
        public Contact(String name) {
            this.name = name;
        }
    
        public Contact(String name, boolean checked) {
            this.name = name;
            this.checked = checked;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public boolean isChecked() {
            return checked;
        }
    
        public void setChecked(boolean checked) {
            this.checked = checked;
        }
    
        public String toString() {
            return name;
        }
    
        public void toggleChecked() {
            checked = !checked;
        }
    }
    
        /** Holds child views for one row. */
        @SuppressWarnings("unused")
        private static class ContactViewHolder {
        private CheckBox checkBox;
        private TextView textView;
    
        public ContactViewHolder() {
        }
    
        public ContactViewHolder(TextView textView, CheckBox checkBox) {
            this.checkBox = checkBox;
            this.textView = textView;
        }
    
        public CheckBox getCheckBox() {
            return checkBox;
        }
    
        public void setCheckBox(CheckBox checkBox) {
            this.checkBox = checkBox;
        }
    
        public TextView getTextView() {
            return textView;
        }
    
        public void setTextView(TextView textView) {
            this.textView = textView;
        }
    }
    
        /** Custom adapter for displaying an array of Contact objects. */
        private static class ContactArrayAdapter extends ArrayAdapter<Contact> {
    
        private LayoutInflater inflater;
    
        public ContactArrayAdapter(Context context, List<Contact> planetList) {
            super(context, R.layout.simplerow, R.id.rowTextView, planetList);
            // Cache the LayoutInflate to avoid asking for a new one each time.
            inflater = LayoutInflater.from(context);
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // Contact to display
            Contact planet = (Contact) this.getItem(position);
            System.out.println(String.valueOf(position));
    
            // The child views in each row.
            CheckBox checkBox;
            TextView textView;
    
            // Create a new row view
            if (convertView == null) {
                convertView = inflater.inflate(R.layout.simplerow, null);
    
                // Find the child views.
                textView = (TextView) convertView
                        .findViewById(R.id.rowTextView);
                checkBox = (CheckBox) convertView.findViewById(R.id.CheckBox01);
    
                // Optimization: Tag the row with it's child views, so we don't
                // have to
                // call findViewById() later when we reuse the row.
                convertView.setTag(new ContactViewHolder(textView, checkBox));
    
                // If CheckBox is toggled, update the Contact it is tagged with.
                checkBox.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        CheckBox cb = (CheckBox) v;
                        Contact contact = (Contact) cb.getTag();
                        contact.setChecked(cb.isChecked());
                    }
                });
            }
            // Reuse existing row view
            else {
                // Because we use a ViewHolder, we avoid having to call
                // findViewById().
                ContactViewHolder viewHolder = (ContactViewHolder) convertView
                        .getTag();
                checkBox = viewHolder.getCheckBox();
                textView = viewHolder.getTextView();
            }
    
            // Tag the CheckBox with the Contact it is displaying, so that we
            // can
            // access the Contact in onClick() when the CheckBox is toggled.
            checkBox.setTag(planet);
    
            // Display Contact data
            checkBox.setChecked(planet.isChecked());
            textView.setText(planet.getName());
    
            return convertView;
        }
    
       }
    
       public Object onRetainNonConfigurationInstance() {
            return contact_read;
        }
    }