Android 将ImageView ImageResource()设置为数据库中列的值
其他程序员 我正在开发一个显示挪威鱼类信息的应用程序。我有一个SQLite数据库,并以以下结构运行:Android 将ImageView ImageResource()设置为数据库中列的值,android,sqlite,imageview,Android,Sqlite,Imageview,其他程序员 我正在开发一个显示挪威鱼类信息的应用程序。我有一个SQLite数据库,并以以下结构运行: CREATE TABLE fisk(image TEXT, id INTEGER PRIMARY KEY AUTOINCREMENT, navn TEXT, familie TEXT, latin TEXT, engelsk TEXT, habitat TEXT, notat TEXT); 我已经成功地读取了所需的数据,但如果您理解我的意思,我想将spesific行上的ImageView设置为
CREATE TABLE fisk(image TEXT, id INTEGER PRIMARY KEY AUTOINCREMENT, navn TEXT, familie TEXT, latin TEXT, engelsk TEXT, habitat TEXT, notat TEXT);
我已经成功地读取了所需的数据,但如果您理解我的意思,我想将spesific行上的ImageView设置为R.drawable.STRING\u FROM\u IMAGE\u COLUMN
有没有关于如何解决这个问题的建议?我不知道应该在代码中的什么位置引用这些图像。所有图像都存储在res/drawable文件夹中,文件名等于数据库中“图像”列中的名称。除了图像,一切都很好,我尝试了很多解决方案,但都没有成功
我的原型和当前工作进度的图像:
代码:
MainActivity.java
包com.dbtes.lol
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteException;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
public class MainActivity extends Activity
{
private TextView tvTest;
private DataBaseHelper myDbHelper;
private SimpleCursorAdapter dataAdapter;
private ImageView ivFisk;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tvTest = (TextView) findViewById(R.id.tvTest);
myDbHelper = new DataBaseHelper(this);
try {
myDbHelper.createDataBase();
tvTest.setText("DB created");
}
catch(IOException ioe) {
throw new Error("Unable to create database");
}
try {
myDbHelper.openDataBase();
tvTest.setText("DB opened");
displayListView();
}
catch(SQLiteException sqle) {
throw sqle;
}
}
public void displayListView() {
Cursor cursor = myDbHelper.fetchAllFishes();
// Bind columns to array
String[] columns = new String[] {
DataBaseHelper.KEY_IMAGE,
DataBaseHelper.KEY_NAME,
DataBaseHelper.KEY_FAMILY,
DataBaseHelper.KEY_LATIN,
DataBaseHelper.KEY_ENGLISH,
DataBaseHelper.KEY_HABITAT,
DataBaseHelper.KEY_NOTE
};
// Reference to XML layout binds
int[] to = new int[] {
R.id.ivFish,
R.id.tvName,
R.id.tvFamily,
R.id.tvLatin,
R.id.tvEnglish,
R.id.tvHabitat,
R.id.tvNote
};
dataAdapter = new SimpleCursorAdapter(this, R.layout.fish_info, cursor, columns, to, 0);
ListView listView = (ListView) findViewById(R.id.listView1);
listView.setAdapter(dataAdapter);
ivFisk = (ImageView) findViewById(R.id.ivFish);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
ListView listView1 = (ListView) findViewById(R.id.listView1);
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Cursor cursor = (Cursor) listView1.getItemAtPosition(position);
// String name = cursor.getString(cursor.getColumnIndexOrThrow("navn"));
// Toast.makeText(getApplicationContext(), name.toLowerCase(), Toast.LENGTH_LONG).show();
}
});
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/tvTest"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="@string/some_text"
android:textSize="20sp" />
<ListView
android:id="@+id/listView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
日志上写着:
MyTag: Adding: 2130837504
MyTag: java.lang.NullPointerException
它清楚地读取并匹配第一项,然后停止。我觉得我离得太近了,不明白为什么会发生这种事。在过去的7个小时里,我尝试了大量的解决方案和“修复”。请给我指个方向或给我一些帮助。提前非常感谢。如果我没有错,那么您希望使用图像的名称设置图像。如果是这样,那么这里就是解决方案 你可以使用这个方法。像下面这样使用它
int id = getResources().getIdentifier(myString, your_string, getPackageName());
Drawable drawable = getResources().getDrawable(id);
yourImageView.setImageDrawable(drawable);
另一个较慢的解决方案(如果有人想知道的话),使用反射
Field field = R.drawable.class.getDeclaredField(your_string);
int id = field.getInt(this); // use this id to set background resource
谢谢你的快速回复。我试图实施一个解决方案,但我无法实现。你能给我指一下正确的方向吗?我应该把代码放在哪里?你能解释一下myString和你的_字符串之间的区别吗?其中一个应该是从数据库中选择的名称,对吗?减小问题大小并使用当前编辑更新。。我现在将尽力在那里合作。将所有图像的名称读入ArrayList。现在的问题是,无论我试图设置什么图像,我都会得到一个NullPointerException。我尝试了一个testimage,但仍然有一个例外。现在读一读,因为我使用两个布局,我是否必须对fish_info.xml进行充气,以及如何充气?
try {
ArrayList<String> testNames = new ArrayList<String>();
testNames = myDbHelper.getNames();
ivFisk = (ImageView) findViewById(R.id.ivFish);
context = this;
if(!testNames.isEmpty()) {
for(String s : testNames) {
int id = context.getResources().getIdentifier(s, "drawable", context.getPackageName());
if(id != 0) {
System.out.println("MyTAG: Adding: " + id); // if name and image exist, just print for debug
/* #####Everything is matching fine, but when I try to run the next two lines, I get NPE ####*/
//Drawable drawable = getResources().getDrawable(id);
//ivFisk.setImageDrawable(drawable);
}
else if(id == 0) { //just running with a few images in drawable-folder just for testing. Takes long to load if I have all, there for a dummy test image.
System.out.println("MyTag: Setting test image");
// ivFisk.setImageResource(R.drawable.testimage);
}
}
}
}
catch(Exception ex)
{
System.out.println("MyTag: " + ex);
}
Drawable drawable = getResources().getDrawable(id);
ivFisk.setImageDrawable(drawable);
MyTag: Adding: 2130837504
MyTag: java.lang.NullPointerException
int id = getResources().getIdentifier(myString, your_string, getPackageName());
Drawable drawable = getResources().getDrawable(id);
yourImageView.setImageDrawable(drawable);
Field field = R.drawable.class.getDeclaredField(your_string);
int id = field.getInt(this); // use this id to set background resource