2012-12-15 42 views
3

我想在每行中使用Imageviews制作一个自定义列表视图,通过从数据库中获取的字符串来设置它们的图像资源。该数据库只包含图像的名称,我需要从资源中加载它。我试过所有的方法来获取名称的资源,但函数总是返回0.无论我做什么,我都无法根据名称获取我的ID。这是我使用的定义适配器....没有获取我的代码中的图像的资源ID

公共类OwnAddptor延伸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。 公共类MainActivity扩展活动{

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()); 

} 

}

+0

你确定你是从数据库中获取正确的名称? – Luksprog

+0

int resID = getResources()。getIdentifier(pictureName,“drawable”,getPackageName());这是否也会返回null? – Kanth

+0

您是否尝试过使用下面给出的解决方案? –

回答

0

这种尝试将解决您的问题。

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

声明以下函数从传递的可绘制字符串名称中获取Drawable资源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)); 

希望这有助于