如何使用查询结果来匹配图像资源?

时间:2014-07-26 11:56:00

标签: android image listview sqlite

为每个人服务,

我正在使用SQLite和android。我试图将查询结果与存储在drawable文件夹中的图像进行匹配。我试图动态搜索,然后将其显示到客户列表视图(图像+文本)。我不知道如何做到这一点。我可以从数据库中检索一个简单的查询结果,并将值显示到列表视图中,但我不知道如何在列表视图中显示图像+文本。任何人都可以帮助我并指导我走正确的道路吗?

以下代码是我活动的一部分

  List<YAODeckHieraticBlue> valuesMainimage = datasource2.SQLDeckHieraticBlueTABLESEARCHMAINDECKIMAGE();

  List<YAODeckHieraticBlue> valuesMain = datasource2.SQLDeckHieraticBlueTABLESEARCHMAINDECK();
ImageView thumbnail;
    thumbnail = (ImageView)findViewById(R.list.thumb);

    TextView name;
    name = (TextView)findViewById(R.list.text);

    name.setText(valuesMain);

    thumbnail.setBackgroundResource ( getResourceID  ( valuesMainimage , "drawable", getApplicationContext() ) );

     //if I just take out the previous section it only display Text but I am missing the Image part in the Listview

  ArrayAdapter<YAODeckHieraticBlue> adapterMain = new ArrayAdapter<YAODeckHieraticBlue>(this,
            android.R.layout.simple_list_item_1, valuesMain);

        setListAdapter(adapterMain);

我使用以下代码来验证图像是否存在

protected final static int getResourceID
(final String resName, final String resType, final Context ctx)
{
    final int ResourceID =
        ctx.getResources().getIdentifier(resName, resType,
            ctx.getApplicationInfo().packageName);
    if (ResourceID == 0)
    {
        throw new IllegalArgumentException
        (
            "No resource string found with name " + resName
        );
    }
    else
    {
        return ResourceID;
    }
   }

我在数据库中的表格如下所示:

  Table Name: [Deck name Hieratic Blue]
  column1:ID    -  Integer        
   column2 [Card Name]  - Text
  column3: Type     - Text
 column4: Deck_typeID - Integer
  Column5: Images  -Text          

注意:image列只存储没有文件扩展名的图像文件名(.png)

1 个答案:

答案 0 :(得分:1)

您正在使用默认的ArrayAdapter将数据放入ListView。您需要的是一个定制的SimpleCursorAdapter。 SimpleCursorAdapter用于从数据库中获取数据。通过扩展此类并覆盖其方法,您还可以将图片放入列表视图中!扩展SimpleCursorAdapter时覆盖newView()和bindView()。还要记住使用View Holder来获得更好的性能。
如果我说的话没有给你任何场景!别担心。使用此链接http://goo.gl/FWls0z 它解释了如何使用自定义适配器创建带有图像的listView。它不包括SimpleCursorAdapter,因为它不使用数据库。但如果你正确理解这个概念。您也可以轻松使用SimpleCursorAdapter。

我为您编写自定义适配器。我希望它有所帮助。

首先,您需要单个单行的布局
布局/ single_row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:padding="10dip" >
<TextView
        android:id="@+id/name_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="28dip" />
<ImageView
        android:id="@+id/name_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

然后你需要定义一个自定义的SimplerCursorAdapter

public class CustomStudentAdapter extends SimpleCursorAdapter {
private int layout;

public CustomStudentAdapter(Context context, int layout, Cursor c){
    super(context, layout, c, null, null, 1);

}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    final LayoutInflater inflater = LayoutInflater.from(context);
    View v = inflater.inflate(layout,parent,false);
    MyViewHolder holder = new MyViewHolder(v);
    v.setTag(holder);

    return v;
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
    int nameIndex = cursor.getColumnIndex(StudentTable.NAME);
    int imageNameIndex = cursor.getColumnIndex(StudentTable.IMAGE_URL);

    String name = cursor.getString(nameIndex);
    String imageName = cursor.getString(imageNameIndex);

    MyViewHolder holder = (MyViewHolder) view.getTag();

    TextView nameInput = holder.name;
    ImageView image = holder.image;


    nameInput.setText(name);
    int imageResource; 
    //colculate image resource based on iamgeName!  
    image.setImageResource(imageResource);
}


//View Holder is only a mechanism for performance increase. findViewById is a cup intensive task. View Holder
//just makes sure its not get called when there is no need for it!! 
class  MyViewHolder{
    private TextView name;
    private ImageView image;

    public MyViewHolder(View v){
        name = (TextView) v.findViewById(R.id.name);
        image = (ImageView) v.findViewById(R.id.image);

    }
}

}

最后在这样的活动中使用自定义适配器。

        Cursor cursor = helper.getAllStudents();
    CustomStudentAdapter studentAdapter = new CustomStudentAdapter(this,R.layout.single_row,cursor);
    this.setListAdapter(studentAdapter);

那就是它。我没有测试过这段代码,代码有可能不起作用!在这种情况下,您需要扩展CursorAdapter,因为它是SimpleCursorAdapter的父级,它为您提供了更大的灵活性!