在我的代码中无法获取图像的资源ID。

3
我正在尝试制作一个自定义列表视图,其中每一行都有一个ImageView,它们通过我从数据库中获取的字符串设置其图像资源。数据库仅包含图像的名称,我需要从资源中加载它。我已经尝试了所有根据名称获取资源的方法,但该函数始终返回0。无论我做什么,我都无法根据名称获取我的ID。这是我正在使用的自定义适配器... public class OwnAddptor extends BaseAdapter {
private LayoutInflater mInflater;
String[] names;
String[] detailarray;
String[] adapimage;
int size;
Context mycont;


public OwnAddptor(Context context,String[] poi_names,String[] details,String[] imageadap) {

        mInflater = LayoutInflater.from(context);
        this.names = poi_names;
        this.detailarray = details;
        this.adapimage = imageadap;
        this.mycont = context;

}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return names.length;
}

@Override
public Object getItem(int puhj) {
    // TODO Auto-generated method stub
    return puhj;
}

@Override
public long getItemId(int arg0) {
    // TODO Auto-generated method stub
    return arg0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View vi=convertView;
     ViewHolder holder;

        if (vi == null) {
            vi = mInflater.inflate(R.layout.blockview, null);
            holder = new ViewHolder();
            holder.headline = (TextView) vi.findViewById(R.id.head_line);
            holder.detail = (TextView) vi.findViewById(R.id.detail);
            holder.image = (ImageView) vi.findViewById(R.id.image);
            vi.setTag(holder);
        } 
        else {  
            holder = (ViewHolder) vi.getTag();  
        }  
        holder.headline.setText(names[position]);
        holder.detail.setText(detailarray[position]);
       // Drawable imgdraw = mycont.getResources().getDrawable(adapimage[position]);
        holder.image.setImageDrawable(getAndroidDrawable(adapimage[position], mycont));
        System.out.println(adapimage[position]);
        return vi;

    }

    static class ViewHolder {
        TextView headline;
        TextView detail;
        ImageView  image;
    }
    public int getImageId(Context context, String name) {
        System.out.println("current name"+name);
        return context.getResources().getIdentifier("drawable/"+name, null, context.getPackageName());



    }
    static public Drawable getAndroidDrawable(String pDrawableName,Context cont){

        int resourceId=Resources.getSystem().getIdentifier(pDrawableName, "drawable", cont.getPackageName());
        System.out.println("resource ids****"+resourceId);
        if(resourceId==0){
            return null;
        } else {
            return Resources.getSystem().getDrawable(resourceId);
        }
    }
}

这是主活动,我在其中查询数据库并将数组传递给自定义适配器类。文本视图根据位置正确设置。唯一的问题在于无法获取资源文件夹中图片的int id。

public class MainActivity extends Activity {

DataBaseHelper baseHelper ;
SQLiteDatabase database;
OwnAddptor adapcustom;
 TextView  detail;
 ListView  view;
 TextView headline;
 String[] name;
 String[] images;
 String[] desc;
 int[] imgids;   
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    List<RowItem> rowItems;

      view = (ListView) findViewById(R.id.mylist);
     baseHelper = new DataBaseHelper(this);
        try
        {
         baseHelper.createDatabase(); 
        }
        catch (IOException ioe)
        {
           throw new Error("Unable to create database");
        }
        try
        {
          baseHelper.openDataBase();

        }
        catch(SQLException sqle)
        {
           throw sqle;
        }
      database = baseHelper.getReadableDatabase();
      Cursor cursor= database.rawQuery("Select * from tblArpoi_local", null);
      int i = 0;

          if (cursor.getCount()>0) {
              cursor.moveToFirst();
              name = new String[cursor.getCount()];
              desc = new String[cursor.getCount()];
              images= new String[cursor.getCount()];
              imgids = new int[cursor.getCount()];
      while (cursor.moveToNext()) {
        images[i]= "poi_"+cursor.getString(cursor.getColumnIndex("arPoiImageLink"));
        name[i] = cursor.getString(cursor.getColumnIndex("arPoiName"));
        desc[i] = cursor.getString(cursor.getColumnIndex("arPoiDescription"));

                i++;
    }



      System.out.println("****"+images.length);
      database.close();
      cursor.close();
      adapcustom = new OwnAddptor(this,name,desc,images);
      view.setAdapter(adapcustom);




          }
}
 public static int getImageId(Context context, String name) {
        System.out.println("current name"+name);
        return context.getResources().getIdentifier("drawable/"+name, null, context.getPackageName());

 }

}


你确定从数据库中获取了正确的名称吗? - user
int resID = getResources().getIdentifier(pictureName , "drawable", getPackageName()); 这个对你也返回 null 吗? - Kanth
你是否尝试使用以下提供的解决方案? - Pratik Sharma
是的,我已经检查了名称,并且它们与可绘制文件夹中的名称相同。我已经尝试了所有建议,但仍然返回零ID。如果您能告诉我获取图像名称的方式是否有问题,就像adapImage [position]一样......我已经记录了数组的输出,我从数组中获取了所有正确的名称,但仍然返回ID 0,请帮忙看看。 - user1900738
如果我的解决方案帮助您解决了问题,那么您可以接受我的答案。谢谢。 - Pratik Sharma
2个回答

0

尝试使用这个,它会解决你的问题。

ImageView my_image = (ImageView) findViewById(R.id.my_imageView);
my_image.setBackgroundResource(getResId("ic_launcher"));

声明以下函数以从传递的可绘制字符串名称获取可绘制资源ID。
public static int getResId(String drawableName) {    
    try {
        Class res = R.drawable.class;
        Field field = res.getField(drawableName);
        int drawableId = field.getInt(null);
        System.out.println("resource ids****"+drawableId);
        return drawableId;
    } catch (Exception e) {
        Log.e("MyTag", "Failure to get drawable id.", e);
        return 0;
    }
}

就是这样。

希望能对你有所帮助。

谢谢。


0

我使用这个

context.getResources().getIdentifier(drawableResourceName, "drawable", context.getPackageName());

它像魔术一样运行。

你可以尝试调用

holder.image.setImageDrawable(context.getResources().getIdentifier(drawableResourceName, "drawable", context.getPackageName()));

替代

holder.image.setImageDrawable(getAndroidDrawable(adapimage[position], mycont));

希望这可以帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接