如何将图像从drawable添加到ListView填充数据库

时间:2012-02-09 11:20:03

标签: android image listview drawable simplecursoradapter

我想知道如何将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旁边显示依赖于活动值的图片。

此致

2 个答案:

答案 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编程。我在一个项目中做了类似的事情并且运行良好。我不知道是否有更简单的方法。

最好的问候。