使用本地资源中的SQLite,图像和文本填充ListView

时间:2015-06-02 22:43:37

标签: android sqlite android-listview

我有一个ListView,它能够显示每个ListViewItem两个TextView和一个ImageView。我还有一个SQLite数据库,其中包含以下字段:mat2cell_idnamedescription

示例记录如下: image1R.string.name1R.string.description1

名称和说明的字符串位于R.drawable.image1文件中,所需的图片位于strings.xml文件夹中,通常由res/drawable引用

我正在使用SQLiteAssetHelper库来管理数据库。

我能够获得包含所需信息的光标,并且我能够使用文本填充列表视图,但是当我运行应用程序时,文本视图显示为R.drawable.image_nameR.string.name1等等。我还没有能够让图像工作。

我如何才能正确显示文字(以便将来可以使用不同的语言)以及如何显示图像?

到目前为止,这是我的代码:

数据库助手

R.string.description1

主要活动

    public class Database extends SQLiteAssetHelper {

        private static final String DATABASE_NAME = "database.sqlite";
        private static final int DATABASE_VERSION = 1;

        public Database(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
            setForcedUpgrade();
        }
        public Cursor getList() {

            SQLiteDatabase db = getReadableDatabase();
            SQLiteQueryBuilder qb = new SQLiteQueryBuilder();

            String [] sqlSelect = {"_id","name","description","image"};
            String sqlTables = "tbl_list";
            qb.setTables(sqlTables);
            Cursor c = qb.query(db, sqlSelect, null, null,
                    null, null, null);

            c.moveToFirst();
            return c;

        }
    }

由于

编辑:我已经编写了一个新的适配器,但图像仍无效:

public class SQLite_List extends ActionBarActivity {
    private ListView listView1;
    private Cursor list;
    private Database db;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.listview);
        getSupportActionBar().setTitle("List");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        db = new Database(this);
        list = db.getList(); //Move this to its own thread later on

        ListAdapter adapter = new SimpleCursorAdapter(this,
                android.R.layout.simple_list_item_2,
                mods,
                new String[] {"name","description"}, //table values
                new int[] {android.R.id.text1,android.R.id.text2});

        listView1 = (ListView) findViewById(R.id.listview);
        listView1.setAdapter(adapter);
        }
...
}

编辑2:我找到了解决方案。答案发布在下面。

1 个答案:

答案 0 :(得分:1)

好的,我让它工作,而不是使用SimpleCursorAdapter,使用自定义适配器。代码可以在下面找到。

然后使用getIdentifier方法将图像或字符串的名称转换为可用于TextView上的setText或ImageView上的setImageResource的整数:< / p>

public class SQLite_ListView_Adapter extends ResourceCursorAdapter {

    public SQLite_ListView_Adapter(Context context, int layout, Cursor c, int flags) {
        super(context, layout, c, flags);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
       TextView name = (TextView) view.findViewById(R.id.txtTitle);
       String name_string=cursor.getString(cursor.getColumnIndex("name"));
       int resIdName = context.getResources().getIdentifier(name_string, "string", context.getPackageName());
       name.setText(resIdName);

       TextView description = (TextView) view.findViewById(R.id.txtDescription);
       String description_string = cursor.getString(cursor.getColumnIndex("description"));
       int resIdDescription = context.getResources().getIdentifier(description_string, "string", context.getPackageName());
       description.setText(resIdDescription);

       ImageView image = (ImageView) view.findViewById(R.id.imgIcon);
       String image_string = cursor.getString(cursor.getColumnIndex("image"));
       int resId=context.getResources().getIdentifier(image_string, "drawable", context.getPackageName());
       image.setImageResource(resId);
    }

}

因此,如果您有字符串R.string.name1,并且希望在TextView中显示该字符串,那么在数据库中记录的名称字段中,您只需要name1 类似的想法与drawables和你可能需要的任何其他东西