SimpleCursorAdapter with ImageView and TextView

不羁岁月 提交于 2019-11-30 13:29:14

问题


can you have a layout with an imageview and textview for a row in a SimpleCursorAdapter with a listview?

this would be the layout

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

<ImageView
    android:id="@+id/icon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

<TextView
    android:id="@+id/bowler_txt"
    android:paddingLeft="25dp"
    android:textSize="30dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Bowler"
    android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>

can it be done in SimpleCursorAdapter with a listview? when I needed images in a listview I always used a custom arrayadapter but never with a cursor.

How would I set the image if it can be done?


回答1:


When the view to bind is an ImageView and there is no existing ViewBinder associated SimpleCursorAdapter.bindView() calls setViewImage(ImageView, String). By default, the value will be treated as an image resource. If the value cannot be used as an image resource, the value is used as an image Uri.

If you need to filter in other ways the value retrieved from the database you need a ViewBinder to add to the ListAdapter as follow:

listAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder(){
   /** Binds the Cursor column defined by the specified index to the specified view */
   public boolean setViewValue(View view, Cursor cursor, int columnIndex){
       if(view.getId() == R.id.your_image_view_id){
           //...
           ((ImageView)view).setImageDrawable(...);
           return true; //true because the data was bound to the view
       }
       return false;
   }
});



回答2:


To expand on the answer from @Francesco Vadicamo, this is a fuctions that is part of a larger activity. I split it off because I needed to call it from multiple areas of the code. databaseHandler and listView are defined as a class variables and initialized in onCreat().

private void updateListView() {
    // Get a Cursor with the current contents of the database.
    final Cursor cursor = databaseHandler.getCursor();

    // The last argument is 0 because no special behavior is required.
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
            R.layout.listview,
            cursor,
            new String[] { databaseHandler.ICON, databaseHandler.BOWLER_TXT },
            new int[] { R.id.icon, R.id.bowler_txt },
            0);

    // Override the handling of R.id.icon to load an image instead of a string.
    adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
        public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
            if (view.getId() == R.id.imageview) {
                // Get the byte array from the database.
                byte[] iconByteArray = cursor.getBlob(columnIndex);

                // Convert the byte array to a Bitmap beginning at the first byte and ending at the last.
                Bitmap iconBitmap = BitmapFactory.decodeByteArray(iconByteArray, 0, iconByteArray.length);

                // Set the bitmap.
                ImageView iconImageView = (ImageView) view;
                iconImageView.setImageBitmap(iconBitmap);
                return true;
            } else {  // Process the rest of the adapter with default settings.
                return false;
            }
        }
    });

    // Update the ListView.
    listView.setAdapter(adapter);
}


来源:https://stackoverflow.com/questions/8510335/simplecursoradapter-with-imageview-and-textview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!