我想知道如何将drawables中的图像添加到listview中。我有ListView与我从数据库中检索的两个TextViews(id,activity)。你能给我一些建议吗?:)
我正在使用
获取数据 SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.history_list_item, cursor, new String[] { Tracks._ID,
Tracks.ACTIVITY }, new int[] { R.id.id, R.id.activity });
我想在textview旁边显示依赖于活动值的图片。
此致
答案 0 :(得分:2)
你需要编写自己的适配器,扩展SimpleCursorAdapter,然后覆盖getView方法,为textview设置图像为coumpund-drawable。
以下只是一个示例,但您可以按自己的方式使用它:
private class NotesListAdapter extends ArrayAdapter<Note>{
public NotesListAdapter() {
super(getBaseContext(), R.layout.list_note_row, R.id.noteHead, notes);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null){
LayoutInflater inflater = getLayoutInflater();
convertView = inflater.inflate(R.layout.list_note_row, parent, false);
holder = new ViewHolder();
holder.txtHeading = ((TextView)convertView.findViewById(R.id.noteHead));
holder.txtContent = ((TextView)convertView.findViewById(R.id.noteBody));
holder.image = ((ImageView)convertView.findViewById(R.id.note_icon));
convertView.setTag(holder);
}
else
holder = (ViewHolder) convertView.getTag();
//set texts
holder.txtHeading.setText("bla bla");
holder.txtHeading.setCompoundDrawables(getResources().getDrawable(R.drawable.app_icon), null, null, null);
holder.txtContent.setText("bla bla");
return convertView;
}
}
//this is better approach as suggested by Google-IO for ListView
static class ViewHolder{
TextView txtHeading;
TextView txtContent;
ImageView image;
}
答案 1 :(得分:2)
如果我理解你的问题,一个解决方案就是在你的布局中包含一个ImageView,如下所示:
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.history_list_item, cursor, new String[] { Tracks.SYMBOL,
Tracks._ID, Tracks.ACTIVITY },
new int[] { R.id.symbol, R.id.id, R.id.activity });
在上面的代码中,Tracks.SYMBOL是带有资源标识的表列,而R.id.symbol是ImageView的id。然后你必须实现SimpleCursorAdapter.ViewBinder接口并将你的实现设置到游标适配器。
在我们看一个例子之前,有一个需要考虑:光标列Tracks.SYMBOL可以有整数,其值等于R.drawable类中所需的资源字段。这不方便,因为这些字段是自动生成的,因此无法控制它们的值。一种解决方案是使用类字段名存储String,并使用反射来获取字段值。
以下是附加到先前定义的适配器的ViewBinder的示例:
adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
@Override
public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
boolean binded = false;
if (view instanceof ImageView) {
int resourceId R.drawable.default_img;
String image = cursor.getString(columnIndex).trim();
try {
resourceId = R.drawable.class.getField(image).getInt(null);
} catch (NoSuchFieldException e) {
}
((ImageView) view).setImageResource(resourceId);
binded = true;
}
return binded;
}
});
使用setViewValue方法的一点是,如果它返回false,那么SimpleCursorAdapter将以通常的方式执行绑定。但是,如果该方法返回true,则SimpleCursorAdapter会认为已完成作业,并且不再尝试绑定该字段。
我刚开始使用Android编程。我在一个项目中做了类似的事情并且运行良好。我不知道是否有更简单的方法。
最好的问候。