Search code examples
androidandroid-layoutsimplecursoradapter

Button inside SimpleCursorAdapter


I've a ListView that I populate with a SimpleCursorAdapter. For each item in my list i've, in this order: TextView > RatingBar > TextView > ImageView. I want to add a button on the ImageView but I dont know how to this...

Where I populate the ListView:

adapter = new SimpleCursorAdapter(this, R.layout.beerdrunk, cursor,
            new String[] { "beers", "notes", "numbers" }, new int[] {
                    R.id.champName, R.id.champNote, R.id.champDrunk });
    adapter.setViewBinder(binder);
    list = (ListView) findViewById(R.id.listMyBeers);
    list.setItemsCanFocus(true);
    list.setOnItemClickListener(onClickBeer);
    list.setAdapter(adapter);

The OnItemClickListener:

private OnItemClickListener onClickBeer = new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
        System.out.println(""+ arg0);
        System.out.println(""+ arg1);
        System.out.println(""+arg2);
        Intent newActivity = new Intent(MyBeers.this, DetailsBeer.class);
        newActivity.putExtra("com.example.checkmybeer.DetailsBeer", ""
                + arg3);
        startActivityForResult(newActivity, 0);
    }
};

And the XML for beerdrunk:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content">

<TextView
    android:id="@+id/champName"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="130"
    android:gravity="center_vertical"
    android:layout_gravity="center_vertical"
    android:maxLines="3"
    android:padding="5dp"
    android:paddingRight="20dp"
    android:singleLine="false"
    android:text="@string/beerBook"
    android:textColor="@color/black1"
    android:textSize="20sp"
    android:textStyle="bold" >
</TextView>

<View
    android:layout_width="1.5dip"
    android:layout_height="fill_parent" />

<RatingBar
    android:id="@+id/champNote"
    style="@style/beerRatingSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:isIndicator="true"        
    android:numStars="5"
    android:layout_margin="1.5dp"
    android:rating="5"
    android:stepSize="0.10" >
</RatingBar>

<View
    android:layout_width="1.5dip"
    android:layout_height="fill_parent" />

<TextView
    android:id="@+id/champDrunk"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_weight="30"
    android:gravity="right|center_vertical"
    android:padding="5dp"
    android:layout_marginLeft="5dp"
    android:text="200"
    android:textColor="@color/black1"
    android:textSize="20sp"
    android:textStyle="bold" />

<View
    android:layout_width="1.5dip"
    android:layout_height="fill_parent" />

<ImageView
    android:id="@+id/champPlusone"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical|right"
    android:layout_margin="5dp"
    android:layout_weight="30"
    android:gravity="right|center_vertical"
    android:clickable="false"
    android:src="@drawable/plus2" />
</LinearLayout>

I've tried something like:

    if(arg2 instanceof ImageView){
     //do some stuff
    }

But it does not work... How can i do to know which view is clicked inside my "row" ?


Solution

  • If you want to click on an image, use an ImageButton instead of an ImageView.
    You can then set the onClick attribute on the button that calls a method in your Activity.

    Extend a SimpleCursorAdapter and in the bindView method add onClick listeners for each button. (Maybe make it call a method in your activity ... public void buttonClicked(int position, View v)... so you know which row and which view was clicked.

    Here is an example implementation of CursorAdapter you could use.

    class CustomCursorAdapter extends CursorAdapter{
        LayoutInflater inflater;
    
        public CustomCursorAdapter(Context context, Cursor c, int flags){
            super(context,c,flags);
            inflater = LayoutInflater.from(context);
        }
    
        @Override
        public void bindView(View view, Context context, Cursor cursor){
            int row_id = cursor.get('_id');  //Your row id (might need to replace)
            ImageButton button = (ImageButton) view.findViewById(R.id.champPlusone);
            button.setOnClickListener(new OnClickListener(){
                @Override
                public void onClick(View v){
                    //ADD STUFF HERE you know which row is clicked. and which button
                }
            });
        }
    
        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent){
            LayoutInflater inflater = LayoutInflater.from(context);
            View v = inflater.inflate(R.layout.beerdrunk, parent, false);
            bindView(v,context,cursor);
            return v;
        }
    
    }
    

    ;)