从ListView /行TextView上的动态背景图像

时间:2012-05-06 15:36:15

标签: android background textview android-listview

我的ListView有两个TextViews。我正在尝试将背景图像动态设置为TextViews之一。我想要显示大约18种不同的图像,具体取决于每个项目/行的类别。图片名为"abc1""abc2"等。以下是我的自定义CursorAdapter的代码:

  private class MyListAdapter extends SimpleCursorAdapter {

    public MyListAdapter(Context context, int layout, Cursor cursor, String[] from, int[] to) {
        super(context, layout , cursor, from, to);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {

        // Get the resource name and id
        String resourceName = "R.drawable.abc" + cursor.getString(7);
        int resid = context.getResources().getIdentifier(resourceName,"drawable",context.getPackageName());

        // Create the idno textview with background image
        TextView idno = (TextView) view.findViewById(R.id.idno);
        idno.setText(cursor.getString(3));
        idno.setBackgroundResource(resid);

        // create the material textview
        TextView materials = (TextView) view.findViewById(R.id.materials);
        materials.setText(cursor.getString(1)); 
    }
}

当我在调试中运行它时,resid总是返回0,表示找不到资源。 resourceName看起来正确,ID:"R.drawable.abc1"。我将图像文件导入res/drawable文件夹,它们列在R.java

这是解决这个问题的正确方法,还是有人有更好的解决方案?

1 个答案:

答案 0 :(得分:1)

您不使用全名,例如R.drawable.abc1,您只使用drawable之后的名称。从getIdentifier()Stringname建立正确的typepackage的工作。因此,getIdentifier()的使用应该是:

String resourceName = "abc" + cursor.getString(7);
int resid = context.getResources().getIdentifier(resourceName,"drawable",context.getPackageName());

另外,您应该看一下将图像设置为背景的另一种方法,因为getIdentifier()是一种要慢得多的执行方法,它将在bindView回调中调用,可以称之为很多时候,当用户向上和向下滚动ListView时(有时用户可以非常快的速度执行此操作)。

编辑:

您可以更有效地使用getIdentifier的一种方法是初始化自定义CursorAdapter中的ID,并在HashMap<Integer, Integer>中存储名称中出现的数字之间的映射(abc) 1 ,abc 2 等)和实际ID:

private HashMap<Integer, Integer> setUpIdsMap() {
     HashMap<Integer, Integer> mapIds = new HashMap<Integer, Integer>();
     // I don't know if you also have abc0, if not use this and substract 1 from the cursor value you get
     for (int i = 0; i < 18; i++) {
         String resourceName = "abc" + 0;
         int resid =       context.getResources().getIdentifier(resourceName,"drawable",context.getPackageName());
         mapIds.put(i, resid);
     }

}

在适配器的构造函数中:

//...field in your adapter class
    HashMap<Integer, Integer> ids = new HashMap<Integer, Integer>();

//in the constructor:
//...
    ids = setUpIdsMap();  
//...

然后在bindView方法中使用返回的数组:

//...
 // Create the idno textview with background image
        TextView idno = (TextView) view.findViewById(R.id.idno);
        idno.setText(cursor.getString(3));
        idno.setBackgroundResource(ids.get(cursor.getString(7)));//depending if you have abc0 or not you may want to substract 1 from cursor.getString(7) to match the value from the setUpIdsMap method
//...