我有一个ListView,它能够显示每个ListViewItem两个TextView和一个ImageView。我还有一个SQLite数据库,其中包含以下字段:mat2cell
,_id
,name
,description
。
示例记录如下:
image
,1
,R.string.name1
,R.string.description1
名称和说明的字符串位于R.drawable.image1
文件中,所需的图片位于strings.xml
文件夹中,通常由res/drawable
引用
我正在使用SQLiteAssetHelper库来管理数据库。
我能够获得包含所需信息的光标,并且我能够使用文本填充列表视图,但是当我运行应用程序时,文本视图显示为R.drawable.image_name
,R.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:我找到了解决方案。答案发布在下面。
答案 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和你可能需要的任何其他东西