2012-12-30 2 views
0

Что я хочу сделать, так это иметь изображение из моей папки drawable-dbimages, отображаемое в ImageView с помощью SimpleCursorAdapter.У вас есть изображение из выпадающей папки, отображаемое в listview с помощью simplecursoradapater

У меня действительно нет понятия, как это сделать. Я знаю, как получить изображение по его имени в базе данных с помощью BitmapFactory.decodeResource, но я не знаю, как применить это к адаптеру.

Например, скажем, у меня есть таблица под названием cars. В этой таблице у меня есть столбец image. Значение image для каждой строки - это имя изображения в папке drawable-dbimages.

Теперь у меня есть этот код:

cursor = datasource.fetchAllCars(); 
to = new int[] { R.id.listitem_car_name, R.id.listitem_car_image }; 
dataAdapter = new SimpleCursorAdapter(this, R.layout.listitem_car, cursor, columns, to, 0); 
setListAdapter(dataAdapter); 

Где R.id.listitem_car_name является TextView и R.id.listitem_car_image является ImageView.

Я знаю, как получить значение image из базы данных и выплевывать его в текстовое представление, но я хочу, чтобы это изображение из папки drawables, имя которой находится в столбце базы данных, отображается в imageview для каждого элемента списка.

Я понятия не имею, как это сделать.

ответ

1

Андроид предварительно изготовлен SimpleCursorAdapter построен только с поддержкой TextViews и сопоставляет столбцы столбцов с ними. Для того, что вы описываете, вам нужно создать свой собственный объект-адаптер, здесь я использовал CursorAdapter, который потребует, чтобы ваши руки были грязными, немного за кулисами. Вот основная конкретизация в моем примере:

cursor = datasource.fetchAllCars(); 
    dataAdapter = new CustomCursorAdapter(this, cursor, 0); 
    setListAdapter(dataAdapter); 

Тогда полномасштабный объект здесь

import android.content.Context; 
import android.database.Cursor; 
import android.support.v4.widget.CursorAdapter; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class CustomCursorAdapter extends CursorAdapter { 

    private LayoutInflater inflater; 

    public CustomCursorAdapter(Context context, Cursor c, int flags) { 
     super(context, c, flags); 
     inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public View newView(Context context, Cursor c, ViewGroup parent) { 
     // do the layout inflation here 
     View v = inflater.inflate(R.layout.listitem_car, parent, false); 
     return v; 
    } 

    @Override 
    public void bindView(View v, Context context, Cursor c) { 
     // do everything else here 
     TextView txt = (TextView) v.findViewById(R.id.listitem_car_name); 
     ImageView img = (ImageView) v.findViewById(R.id.listitem_car_image); 

     String text = c.getString(c.getColumnIndex("COLUMN_TEXT")); 
     txt.setText(text); 

     // where the magic happens 
     String imgName = c.getString(c.getColumnIndex("COLUMN_IMAGE")); 
     int image = context.getResources().getIdentifier(imgName, "drawable", context.getPackageName()); 
     img.setImageResource(image); 
    } 

} 

Я надеюсь, что это в основном за себя, но ту частью, где я меченый «где происходит волшебство» должна быть самая важная часть, относящаяся к вашему вопросу. в основном, вы получаете имя изображения из базы данных, а следующая строка пытается найти изображение по имени (а не по id, как обычно), тогда вы просто устанавливаете изображение, как обычно. Метод возвращает int 0 для изображений, которые он не может найти, поэтому вы можете или не хотите выполнять обработку ошибок для этого. Более того, если вы хотите использовать другие способы загрузки вашего изображения, это место для этого.