javaandroidlistviewsimplecursoradapter

how do i create a custom cursor adapter for a listview for use with images and text?


Hi want to create a custom cursor adapter so I can display an image with 2 lines of text. I have had some trouble understanding the custom cursor adapters but I do not understand how to add an imageview to be filled from the path in my database.


Solution

  • Will,

    I've actually implemented something incredibly similar to what you are looking for. Here is my implementation.

    import android.content.Context;
    import android.content.SharedPreferences;
    import android.content.res.Resources;
    import android.database.Cursor;
    import android.preference.PreferenceManager;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.CursorAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    
    public class ItemAdapter extends CursorAdapter {
        private LayoutInflater mLayoutInflater;
        private Context mContext;
        public ItemAdapter(Context context, Cursor c) {
            super(context, c);
            mContext = context;
            mLayoutInflater = LayoutInflater.from(context); 
        }
    
        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            View v = mLayoutInflater.inflate(R.layout.items_row, parent, false);
            return v;
        }
    
        /**
         * @author will
         * 
         * @param   v
         *          The view in which the elements we set up here will be displayed.
         * 
         * @param   context
         *          The running context where this ListView adapter will be active.
         * 
         * @param   c
         *          The Cursor containing the query results we will display.
         */
    
        @Override
        public void bindView(View v, Context context, Cursor c) {
            String title = c.getString(c.getColumnIndexOrThrow(ItemDbAdapter.KEY_TITLE));
            String date = c.getString(c.getColumnIndexOrThrow(ItemDbAdapter.KEY_DATE));
            String imagePath = c.getString(c.getColumnIndexOrThrow(ItemDbAdapter.KEY_IMG));
            int deletion = c.getInt(c.getColumnIndexOrThrow(ItemDbAdapter.KEY_DELETION));
            int priority = c.getInt(c.getColumnIndexOrThrow(ItemDbAdapter.KEY_PRIORITY));
    
            /**
             * Next set the title of the entry.
             */
    
            TextView title_text = (TextView) v.findViewById(R.id.item_text);
            if (title_text != null) {
                title_text.setText(title);
            }
    
            /**
             * Set Date
             */
    
            TextView date_text = (TextView) v.findViewById(R.id.item_date);
            if (date_text != null) {
                date_text.setText(date);
            }       
    
            /**
             * Decide if we should display the paper clip icon denoting image attachment
             */
    
            ImageView item_image = (ImageView) v.findViewById(R.id.item_attachment);
            item_image.setVisibility(ImageView.INVISIBLE);
            if (imagePath != null && imagePath.length() != 0 && item_image != null) {
                item_image.setVisibility(ImageView.VISIBLE);
            }
    
            /**
             * Decide if we should display the deletion indicator
             */
            ImageView del_image = (ImageView) v.findViewById(R.id.item_deletion);
            del_image.setVisibility(ImageView.INVISIBLE);
            if (deletion == 1) {
                del_image.setVisibility(ImageView.VISIBLE);
            }
        }
    }
    

    XML just incase...

    <?xml version="1.0" encoding="utf-8"?>
    
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:background="@drawable/list_bg">
    
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">
    
            <TextView android:id="@+id/item_text"
                android:layout_width="200dp"
                android:layout_height="wrap_content"
                android:lines="1"
                android:scrollHorizontally="true"
                android:ellipsize="end"
                android:paddingLeft="2sp"
                android:paddingTop="2sp"
                android:textSize="18sp"
                android:textStyle="bold"
                android:shadowColor="#90909090"
                android:shadowDx="1.0"
                android:shadowDy="1.0"
                android:shadowRadius="1.0"/>
    
            <TextView android:id="@+id/item_date"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="12sp"
                android:textColor="#FF808080"
                android:paddingLeft="2sp"
                android:paddingTop="2sp"/>
        </LinearLayout>
    
        <ImageView android:id="@+id/item_deletion"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/deletion"
            android:visibility="invisible"
            android:layout_centerVertical="true"
            android:layout_alignParentRight="true"
            android:paddingRight="5sp"/>
    
        <ImageView android:id="@+id/item_attachment"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/attachment"
            android:visibility="invisible"
            android:layout_centerVertical="true"
            android:layout_toLeftOf="@id/item_deletion"/>
    
    </RelativeLayout>
    

    This displays two rows of text and up to 2 images to the right of the text depending on certain conditions.

    I hope this can give you a basis to work from!

    Good luck :]