1

ListViewは 2 つの を持っていTextViewsます。背景画像を のいずれかに動的に設定しようとしていますTextViews。各項目/行のカテゴリに応じて、表示したい約 18 の異なる画像があります。画像の名前"abc1""abc2"、 などです。カスタムのコードは次のCursorAdapterとおりです。

  private class MyListAdapter extends SimpleCursorAdapter {

    public MyListAdapter(Context context, int layout, Cursor cursor, String[] from, int[] to) {
        super(context, layout , cursor, from, to);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {

        // Get the resource name and id
        String resourceName = "R.drawable.abc" + cursor.getString(7);
        int resid = context.getResources().getIdentifier(resourceName,"drawable",context.getPackageName());

        // Create the idno textview with background image
        TextView idno = (TextView) view.findViewById(R.id.idno);
        idno.setText(cursor.getString(3));
        idno.setBackgroundResource(resid);

        // create the material textview
        TextView materials = (TextView) view.findViewById(R.id.materials);
        materials.setText(cursor.getString(1)); 
    }
}

デバッグで実行すると、リソースが見つからなかったことを示すresid常に返されます。ID: は正しく見え0ます。イメージ ファイルをフォルダにインポートしたところ、にリストされています。resourceName"R.drawable.abc1"res/drawableR.java

これは正しい方法ですか、それともより良い解決策がありますか?

4

1 に答える 1

1

フル ネームは使用しません。たとえばR.drawable.abc1、 の後に名前のみを使用しますdrawable。、 、から正しいをgetIdentifier()構築するのが仕事です。したがって、の使用は次のようにする必要があります。StringnametypepackagegetIdentifier()

String resourceName = "abc" + cursor.getString(7);
int resid = context.getResources().getIdentifier(resourceName,"drawable",context.getPackageName());

また、画像を背景として設定する別の方法を検討する必要があります。これgetIdentifier()は、実行するメソッドがはるかに遅く、ユーザーが上下にbindViewスクロールするときに何度も呼び出される可能性のあるコールバックで呼び出されるためです (時々ListViewユーザーは非常に速いペースでこれを行うことができます)。

編集 :

getIdentifierをより効率的に使用できる 1 つの方法は、カスタムで ID を初期化し、名前に表示される番号 (abc 1、abc 2など) と実際の ID の間のマッピングCursorAdapterに保存することです。HashMap<Integer, Integer>

private HashMap<Integer, Integer> setUpIdsMap() {
     HashMap<Integer, Integer> mapIds = new HashMap<Integer, Integer>();
     // I don't know if you also have abc0, if not use this and substract 1 from the cursor value you get
     for (int i = 0; i < 18; i++) {
         String resourceName = "abc" + 0;
         int resid =       context.getResources().getIdentifier(resourceName,"drawable",context.getPackageName());
         mapIds.put(i, resid);
     }

}

アダプタのコンストラクタで:

//...field in your adapter class
    HashMap<Integer, Integer> ids = new HashMap<Integer, Integer>();

//in the constructor:
//...
    ids = setUpIdsMap();  
//...

次に、bindViewメソッドで、次によって返される配列を使用します。

//...
 // Create the idno textview with background image
        TextView idno = (TextView) view.findViewById(R.id.idno);
        idno.setText(cursor.getString(3));
        idno.setBackgroundResource(ids.get(cursor.getString(7)));//depending if you have abc0 or not you may want to substract 1 from cursor.getString(7) to match the value from the setUpIdsMap method
//...
于 2012-05-07T03:18:37.550 に答える