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);
}