14

I have a ListView with CheckBox on it. and i am using Custom Adapter to populate the ListView.

In my xml file i have a Button at bottom. what i want is let user select number of rows in ListView and when he/she clicked on the Button get the position of the selected items so that i could get the object for particular row for further calculations.

Akram
  • 7,548
  • 8
  • 45
  • 72
  • http://stackoverflow.com/questions/10895763/checkbox-unchecked-when-i-scroll-listview-in-android/10896140#comment14205583_10896140 – Lalit Poptani Jun 06 '12 at 09:53

3 Answers3

2

In the customadapter's getview method, do

//use the actual id of your checkbox of course
Checkbox checkbox = (CheckBox)findViewById(R.id.checkbox); 
checkbox.setFocusable(false);
checkbox.setFocusableInTouchMode(false);

now the checkbox is clickable as is the listitem.

Biojayc
  • 111
  • 8
0

To solve this problem you will have to create a custom Item class which will represent your individual checkboxes on the list. The array of these items will then be used by the adapter class to display your check boxes.

This Item class will have a boolean variable isSelected which will determine if the checkbox is selected or not. You will have to set the value of this variable in your OnClick Method of your custom adapter class

For Example

    class CheckBoxItem{

    boolean isSelected;


    public void setSelected(boolean val) {
            this.isSelected = val;
        }

        boolean isSelected(){
            return isSelected;

        }   

    }

For your CustomAdapter Class which look like following:

    public class ItemsAdapter extends ArrayAdapter implements OnClickListener { 

// you will have to initialize below in the constructor 
    CheckBoxItem items[];



    // You will have to create your check boxes here and set the position of your check box
    /// with help of setTag method of View as defined in below method, you will use this later // in your onClick method 

    @Override 
        public View getView(int position, View convertView, ViewGroup parent) { 
            View v = convertView; 



            CheckBox cBox = null;

            if (v == null) { 
                LayoutInflater vi = (LayoutInflater) apUI.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
                v = vi.inflate(R.layout.attachphoto, null);     

            } 



            CheckBoxItemItem it = items[position];      

            cBox =(CheckBox) v.findViewById(R.id.apCheckBox);
            cBox.setOnClickListener(this);
            cBox.setTag(""+position);       


            Log.d(TAG, "  CHECK BOX IS: "+cBox+ "   Check Box selected Value: "+cBox.isChecked()+"  Selection: "+it.isSelected());
            if(cBox != null){
                cBox.setText("");
                cBox.setChecked(it.isSelected());
            }       


            return v; 
        } 


        public void onClick(View v) {
            CheckBox cBox =(CheckBox) v.findViewById(R.id.apCheckBox);
            int position = Integer.parseInt((String) v.getTag());

            Log.d(TAG, "CLicked ..."+cBox.isChecked());

            items[position].setSelected(cBox.isChecked());              
        } 

    }

Later you will will declare and array of your CheckBoxItem class which will be contained by your Adapter class in this case it will be ItemsAdapter class.

Then when the user presses the button you can iterate through all the items in the array and check which one is selected by using the isSelected() method of CheckBoxItem class.

In your activity you will have:

ArrayList getSelectedItems(){

ArrayList selectedItems = new ArrayList();

int size = items.length;

        for(int i = 0; i<size; i++){
            CheckBoxItem cItem = items[i];
            if(cItem.isSelected()){                 
                selectedItems.add(cItem);                   
            }           
        }

return selectedItems;

}
user_CC
  • 4,686
  • 3
  • 20
  • 15
0

I had the exact same problem. I solved it in this way

public class myActivity extends Activity  {
//ActionBarSherlock mSherlock = ActionBarSherlock.wrap(this);
public ListView listview;
private ArrayList<Object> itemlist=new ArrayList<Object>();
Button button;
private myAdapter adapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    listview=(ListView)findViewById(R.id.listview1);
    button=(Button)findViewById(R.id.button1);
    /*add some data to ur list*/ itemlist.add(something);
    adapter=new Adapter(myActivity.this, 0, itemlist);
    listview.setAdapter(adapter);
    **listview.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    listview.setItemsCanFocus(false);**
    button.setOnClickListner(new OnClickListner()
    {
     @Override
     public void OnClick(View v)
     {
      /* this returns the checked item positions in the listview*/
      **ArrayList<Integer> itempositions=adapter.getcheckeditemcount();**

    for(int i:itempositions)
    {
             /* This is the main part...u can retrieve the object in the listview which is checked and do further calculations with it*/
        **Object info=adapter.getItem(i);**
                          Log.d(TAG,"checked object info= ",info.something);
                 }
     }
    });
}


private class myAdapter extends ArrayAdapter<Object>  {

    private Context context;
    private ArrayList<Object> list;
    **private ArrayList<Integer> checkedpositions;**


    public myAdapter(Context localContext,int textViewResourceId, ArrayList<Object> objects) {
        super(localContext,textViewResourceId,objects);
        context = localContext;
        this.list=objects;
        this.checkedpositions=new  ArrayList<Integer>();
        //Log.d("adapter","list size= "+objects.size());
    }

@Override       
    public View getView(int position, View convertView, ViewGroup parent) {

        ImageView picturesView;
        View v = convertView;
        TextView Mainitem;
        final CheckBox check;

       if (v == null) 
       {
           LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
           v = vi.inflate(R.layout.albumview, null);


           Object item=list.get(position);
           if(item!=null)
           {

               check = (CheckBox)v.findViewById(R.id.checkBox1);
                   /* set a tag for chekbox with the current view position */
               **check.setTag(position);**
                   /*set a onchecked change listner for listning to state of checkbox toggle */
               check.setOnCheckedChangeListener(new OnCheckedChangeListener() 
               { 
                   @Override
                   public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
                   {             
                                       /*get the tag of the checkbox...in this case this will give the (position of view)*/
                       Object tag=check.getTag();
                       if ( isChecked ) 
                       { 
                           // perform logic 
                           count++;
                           Log.d("Checkbox","added "+tag);
                           checkedpositions.add((Integer) tag);
                       } 
                       else
                       {
                           count--;
                           checkedpositions.remove(tag);
                           Log.d("Checkbox","removed "+(Integer)tag);
                       }

               /* if u dont have a textview in ur listview then ignore this part */        
               Mainitem = (TextView) v.findViewById(R.id.textView1);
               Mainitem.setText(item.Album_name);

               } catch (IOException e) {
                     // TODO Auto-generated catch block
                     Log.d("error", "wall");
                 }

           }

       }

    return v;

    }
   /* Finally create a method which return the checkeditem postions in the listview */
**public ArrayList<Integer> getcheckeditemcount()
{
    return this.checkedpositions;
}**

}

}

I hope this helps.

Marko
  • 20,385
  • 13
  • 48
  • 64