Android 将ImageView ImageResource()设置为数据库中列的值

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设置为

其他程序员

我正在开发一个显示挪威鱼类信息的应用程序。我有一个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设置为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