SimpleCursorAdapter с ImageView и TextView

у вас есть макет с imageview и textview для строки в SimpleCursorAdapter со списком?

это будет макет

<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>

можно ли это сделать в SimpleCursorAdapter со списком? когда мне нужны были изображения в списке, я всегда пользовался пользовательским массивом, но никогда не с помощью курсора.

Как установить изображение, если это можно сделать?

Ответ 1

Когда представление для привязки является ImageView, и нет существующих ViewBinder связанных SimpleCursorAdapter.bindView() вызовов setViewImage(ImageView, String). По умолчанию значение будет рассматриваться как ресурс изображения. Если значение не может использоваться в качестве ресурса изображения, это значение используется как изображение Uri.

Если вам нужно отфильтровать другим способом значение, полученное из базы данных, вам нужно ViewBinder добавить в ListAdapter следующее:

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

Чтобы расширить ответ от @Francesco Vadicamo, это fuctions, который является частью более активного действия. Я разделил его, потому что мне нужно было вызвать его из нескольких областей кода. databaseHandler и listView определяются как переменные класса и инициализируются в 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);
}