Mehdi
Mehdi

Reputation: 339

how to have a ListView of CheckBoxe's in android?

I know its a little odd but it will be very useful for my app . I tried setting the adapter with ArrayList and Array of CheckBoxe's in both cases codes compiled okay but it doesn’t executed in android I tried these :

Array Attempt : definitions in the class ,

CheckBox[] listCB ;
CheckBox CB1 , CB2 , CB3 ;
ListView lv ;

overrided onCreate() method :

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    listCB = new CheckBox[2] ;
    CB1 = new CheckBox(null,null);
    CB2 = new CheckBox(null,null);
    CB3 = new CheckBox(null,null);

    CB1.setText("one");
    CB2.setText("two");
    CB3.setText("three");

    listCB[0] = CB1 ;
    listCB[1] = CB2 ;
    listCB[2] = CB3 ;

    lv = (ListView) findViewById(R.id.listView) ;

    lv.setAdapter(new ArrayAdapter<CheckBox>(this , R.layout.listcb , listCB));


}

ArrayList Attempt : definitions in the class :

ArrayList<CheckBox> listCB ;
CheckBox CB1 , CB2 , CB3 ;
ListView lv ;

overrided onCreate() method :

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    listCB = new ArrayList<CheckBox>() ;
    CB1 = new CheckBox(null,null);
    CB2 = new CheckBox(null,null);
    CB3 = new CheckBox(null,null);

    CB1.setText("one");
    CB2.setText("two");
    CB3.setText("three");

    listCB.add(CB1) ;
    listCB.add(CB2) ;
    listCB.add(CB3) ;

    lv = (ListView) findViewById(R.id.listView) ;

    lv.setAdapter(new ArrayAdapter<CheckBox>(this , R.layout.listcb , listCB));


}

and the layout which referred to :

    <CheckBox
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/checkBox"
    android:layout_gravity="center_horizontal"
    android:checked="false"
    android:textColor="#ffffffff"
    android:clickable="true">
</CheckBox>

Both of them failed !

Upvotes: 0

Views: 100

Answers (2)

Tanveer Ahmad
Tanveer Ahmad

Reputation: 94

package com.windrealm.android;  

import java.util.ArrayList;  
import java.util.Arrays;  
import java.util.List;  

import android.app.Activity;  
import android.content.Context;  
import android.os.Bundle;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.ViewGroup;  
import android.widget.AdapterView;  
import android.widget.ArrayAdapter;  
import android.widget.CheckBox;  
import android.widget.ListView;  
import android.widget.TextView;  


    public class PlanetsActivity extends Activity {  

      private ListView mainListView ;  
      private Planet[] planets ;  
      private ArrayAdapter<Planet> 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 );  

        // 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) {  
            Planet planet = listAdapter.getItem( position );  
            planet.toggleChecked();  
            PlanetViewHolder viewHolder = (PlanetViewHolder) item.getTag();  
            viewHolder.getCheckBox().setChecked( planet.isChecked() );  
          }  
        });  


        // Create and populate planets.  
        planets = (Planet[]) getLastNonConfigurationInstance() ;  
        if ( planets == null ) {  
          planets = new Planet[] {   
              new Planet("Mercury"), new Planet("Venus"), new Planet("Earth"),   
              new Planet("Mars"), new Planet("Jupiter"), new Planet("Saturn"),   
              new Planet("Uranus"), new Planet("Neptune"), new Planet("Ceres"),  
              new Planet("Pluto"), new Planet("Haumea"), new Planet("Makemake"),  
              new Planet("Eris")  
          };    
        }  
        ArrayList<Planet> planetList = new ArrayList<Planet>();  
        planetList.addAll( Arrays.asList(planets) );  

        // Set our custom array adapter as the ListView's adapter.  
        listAdapter = new PlanetArrayAdapter(this, planetList);  
        mainListView.setAdapter( listAdapter );        
      }  

      /** Holds planet data. */  
      private static class Planet {  
        private String name = "" ;  
        private boolean checked = false ;  
        public Planet() {}  
        public Planet( String name ) {  
          this.name = name ;  
        }  
        public Planet( 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 PlanetViewHolder {  
        private CheckBox checkBox ;  
        private TextView textView ;  
        public PlanetViewHolder() {}  
        public PlanetViewHolder( 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 PlanetArrayAdapter extends ArrayAdapter<Planet> {  

        private LayoutInflater inflater;  

        public PlanetArrayAdapter( Context context, List<Planet> 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  
          Planet planet = (Planet) 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 PlanetViewHolder(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 ;  
            Planet planet = (Planet) cb.getTag();  
            planet.setChecked( cb.isChecked() );  
          }  
        });          
      }  
      // Reuse existing row view  
      else {  
        // Because we use a ViewHolder, we avoid having to call findViewById().  
        PlanetViewHolder viewHolder = (PlanetViewHolder) 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 planets ;  
  }  
}  

Upvotes: 0

Denis Steinman
Denis Steinman

Reputation: 7799

Of course, it doesn't work! You need specify parent for your checkbox, now your checkboxes just contain in array (for example, as strings or other objects), it is not attached to GUI hierarchy to Android draw and handle it. I think that better write custom adapter.

Upvotes: 1

Related Questions