我的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
。
这是解决这个问题的正确方法,还是有人有更好的解决方案?
答案 0 :(得分:1)
您不使用全名,例如R.drawable.abc1
,您只使用drawable
之后的名称。从getIdentifier()
,String
和name
建立正确的type
是package
的工作。因此,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
//...