1

我有一个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.

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

4

1 回答 1

1

您不使用全名,例如R.drawable.abc1,您只使用 之后的名称drawable。这是从,和getIdentifier()建立正确的工作。所以,使用的应该是:StringnametypepackagegetIdentifier()

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

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

编辑 :

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

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
//...
于 2012-05-07T03:18:37.550 回答