Selected items from listview with checkbox in android

11,050

Solution 1

Now what I want is, I want to get the names of all the checked list items onclick of a button.

Why don't you iterate over itemss array and get the items which their checked field is true?

I also want to know how will it be possible to show another textview, say price below item name.

Update your simplerow.xml(add the price TextView) and also your SelectViewHolder and SelectArralAdapter for that.

These shouldn't be very hard to code i guess.

Solution 2

You should keep states of checboxes in your custom adapter, and which uses some ArrayList or SparseArray. Then when you want to get names of all check items you just traverse your array and read names where checked parameter is true. Of course the list should be updated when checkbox state changes.

That's only proper solution, because only few ListView items are visibile on the screen, so trying to read their properties on the fly is unreliable - any moment item may be recycled thus become not accessible.

Share:
11,050

Related videos on Youtube

kittu88
Author by

kittu88

I am an android, Phonegap and Titanium Appcelerator Developer

Updated on September 14, 2022

Comments

  • kittu88
    kittu88 over 1 year

    I have created a listview with checkboxes and search functionality. The search is working fine, the checkboxes are also showing. Now what I want is, I want to get the names of all the checked list items onclick of a button. I also want to know how will it be possible to show another textview, say price below item name.

    The main layout:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    
        <!-- Editext for Search -->
    
        <EditText
            android:id="@+id/inputSearch"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="Search products.."
            android:inputType="textVisiblePassword" />
    
        <ListView
            android:id="@+id/mainListView"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" >
        </ListView>
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="5dp"
            android:onClick="showResult"
            android:text="Show Result" >
        </Button>
    
    </LinearLayout>
    

    The simplerow.xml file:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent">
    
      <TextView android:id="@+id/rowTextView" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textStyle="bold"
        android:textSize="16sp" >
      </TextView>
    
      <CheckBox android:id="@+id/CheckBox01" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:padding="10dp"
        android:layout_alignParentRight="true" android:layout_marginRight="6sp"
        android:focusable="false">
      </CheckBox>
    
    </RelativeLayout>
    

    The activity:

    public class MultiSelectList extends Activity {
    
         // Search EditText
           EditText inputSearch;
    
        private ListView mainListView;
        private mItems[] itemss;
        private ArrayAdapter<mItems> listAdapter;
        ArrayList<String> checked = new ArrayList<String>();
    
        /** 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);
            inputSearch = (EditText) findViewById(R.id.inputSearch);
    
            // When item is tapped, toggle checked properties of CheckBox and
            // Planet.
            mainListView
                    .setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> parent, View item,
                                int position, long id) {
                            mItems planet = listAdapter.getItem(position);
                            planet.toggleChecked();
                            SelectViewHolder viewHolder = (SelectViewHolder) item
                                    .getTag();
                            viewHolder.getCheckBox().setChecked(planet.isChecked());
    
                        }
                    });
    
            // Create and populate planets.
            itemss = (mItems[]) getLastNonConfigurationInstance();
    
            ArrayList<mItems> planetList = new ArrayList<mItems>();
    
            planetList.add(new mItems("DJ- Android"));
            planetList.add(new mItems("Android"));
            planetList.add(new mItems("iPhone"));
            planetList.add(new mItems("BlackBerry"));
            planetList.add(new mItems("Java"));
            planetList.add(new mItems("PHP"));
            planetList.add(new mItems(".Net"));
            planetList.add(new mItems("Jhoomla"));
    
            // Set our custom array adapter as the ListView's adapter.
            listAdapter = new SelectArralAdapter(this, planetList);
            mainListView.setAdapter(listAdapter);
    
             /**
                * Enabling Search Filter
                * */
               inputSearch.addTextChangedListener(new TextWatcher() {
    
                   @Override
                   public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
                       // When user changed the Text
                       MultiSelectList.this.listAdapter.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                          
                   }
               });
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // TODO Auto-generated method stub
            menu.add(0, 1, Menu.NONE, "Products");
            return super.onCreateOptionsMenu(menu);
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // TODO Auto-generated method stub
            switch (item.getItemId()) {
            case 1:
    
                for (int i = 0; i < checked.size(); i++) {
                    Log.d("pos : ", "" + checked.get(i));
                }
                break;
            }
            return super.onOptionsItemSelected(item);
        }
    
        /** Holds planet data. */
        private static class mItems {
            private String name = "";
            private boolean checked = false;
    
            public mItems() {
            }
    
            public mItems(String name) {
                this.name = name;
            }
    
            public mItems(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. */
        private static class SelectViewHolder {
            private CheckBox checkBox;
            private TextView textView;
    
            public SelectViewHolder() {
            }
    
            public SelectViewHolder(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 Planet objects. */
        private static class SelectArralAdapter extends ArrayAdapter<mItems> {
            private LayoutInflater inflater;
    
            public SelectArralAdapter(Context context, List<mItems> 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) {
                // Planet to display
                mItems planet = (mItems) this.getItem(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 SelectViewHolder(textView, checkBox));
                    // If CheckBox is toggled, update the planet it is tagged with.
                    checkBox.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View v) {
                            CheckBox cb = (CheckBox) v;
                            mItems planet = (mItems) cb.getTag();
                            planet.setChecked(cb.isChecked());
                        }
                    });
                }
                // Reuse existing row view
                else {
                    // Because we use a ViewHolder, we avoid having to call
                    // findViewById().
                    SelectViewHolder viewHolder = (SelectViewHolder) convertView
                            .getTag();
                    checkBox = viewHolder.getCheckBox();
                    textView = viewHolder.getTextView();
                }
    
                // Tag the CheckBox with the Planet it is displaying, so that we can
                // access the planet in onClick() when the CheckBox is toggled.
                checkBox.setTag(planet);
                // Display planet data
                checkBox.setChecked(planet.isChecked());
                textView.setText(planet.getName());
                return convertView;
            }
        }
    
        public Object onRetainNonConfigurationInstance() {
            return itemss;
        }
    
    
    
    
    }
    

    What should I do to get the desired result?

  • kittu88
    kittu88 over 10 years
    Code suggestions please!
  • Malachiasz
    Malachiasz over 10 years
    stackoverflow.com/questions/12647001/… - here is some custom adapter with ListView containing checkboxes.