3

データベースから取得した文字列を介して画像リソースを設定する各行に Imageviews を含むカスタム リスト ビューを作成しようとしています。データベースには画像の名前のみが含まれており、リソースからロードする必要があります。名前でリソースを取得するすべての方法を試しましたが、関数は常に 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());

 }

}

4

2 に答える 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;
    }
}

それでおしまい。

お役に立てば幸いです。

ありがとう。

于 2012-12-15T09:16:16.577 に答える
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));

この助けを願っています

于 2012-12-15T17:35:55.220 に答える