ImageViewの表示方法で教えてください。

1,903 views
Skip to first unread message

sanji03

unread,
Oct 3, 2010, 8:10:18 AM10/3/10
to 日本Androidの会
初めまして、sanji03と申します。

AndroidでJavaアプリケーションを作ろうとしてますが初心者のため、よくわからないことがございます。

Androidにてリスト表示する場合は、
listViewを使用しArrayAdapterにて
リストの配列 list[]に保存した文字列を

ArrayAdapter<CharSequence> adapter = new
ArrayAdapter<CharSequence>(Main.this,
android.R.layout.simple_list_item_1, list);
listView.setAdapter(adapter);

のように表示できているのですが

アイコン画像を上記リスト表示と同じように表示させたいのです。

ためにし

画像の配列 imageView[]に
int img_id =getResources().getIdentifier(e.getString(0), "drawable",
getPackageName());
imageView[i].setImageResource(img_id);
のような形でSQliteDBに保存しておいたアイコン名とアイコンのidをImageViewの配列にセットしておき

ArrayAdapter<ImageView> adapter2 = new
ArrayAdapter<mageView>(Main.this, android.R.layout.simple_list_item_1,
imageView);
ImageView imageView2 = (ImageView)findViewById(R.id.ImageView01);
imageView2.setAdapter(adapter2);

のようにすれば表示できるかなと思い、やってみましたが

メソッド setAdapter(ArrayAdapter<ImageView>) は型 ImageView で未定義です
とのエラーでうまくいきませんでした。

最終的にやりたいことはリスト表示の横にアイコンを表示したいだけなのですが・・・。
達成できる方法をご教示いただけないでしょうか。

よろしくお願いいたします。

yokmama

unread,
Oct 3, 2010, 9:35:10 PM10/3/10
to android-g...@googlegroups.com
夜子ままです

ArrayAdapterはリスト内容を該当する項目のテキストに設定するだけなのでイメージの場合は
ArrayAdapterを継承したクラスを作成するなどして、getViewにて各ImageViewにイメージを設定するしかありません。

Imageを表示するAdapterのサンプルは


ここにあるImageAdapterが参考になるとおもいます、ただしこちらのサンプルは固定でイメージをもっていますので引数でイメージの配列をうけとってそれを使うようにする工夫がいります。


2010年10月3日21:10 sanji03 <osaj...@gmail.com>:

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。


Tomoki Iwai

unread,
Oct 4, 2010, 8:18:11 AM10/4/10
to 日本Androidの会
こんにちは。岩井です。

GridViewではなくListViewで表示する方法になりますが

・1行分のレイアウトを定義(XML)
・ListViewのAdapterを自作

とすれば、比較的華麗に実現できると思います。
以下、サンプルソースです。

■ListView1行分のレイアウトを定義
※res/layout/row.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="wrap_content"
>
<ImageView
android:id="@+id/rowicon"
android:layout_height="fill_parent"
android:layout_width="wrap_content"
android:src="@drawable/icon" />
<TextView
android:id="@+id/rowtext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>


■ActivityのonCreateでListViewの作成&設定を行う

// ListViewを作成
ListView listView = new ListView(getApplicationContext());

// レイアウトパラメータ
LinearLayout.LayoutParams param
= new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT);

// ListViewを載せる
addContentView(listView, param);

// ListViewに表示する適当なデータ
List<String> data = Arrays.asList(new String[]{"a", "b", "c", "d"});

// 自作アダプタを作成
MyAdapter adpt = new MyAdapter(getApplicationContext(), R.layout.row,
data);

// アダプタを設定
listView.setAdapter(adpt);


■自作アダプタ

class MyAdapter extends ArrayAdapter<String>
{
private LayoutInflater iInflater;

public MyAdapter(Context context, int textViewResourceId,
List<String> objects)
{
super(context, textViewResourceId, objects);
iInflater = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

// 1行分のViewを取得/作成するとこ
public View getView(int aPos, final View aView, ViewGroup aParent)
{
View view = aView;
if (view == null)
{
view = iInflater.inflate(R.layout.row, null);
}

// TextViewに文字列を表示
TextView txtView = (TextView)view.findViewById(R.id.rowtext);
txtView.setText(getItem(aPos));

// こんな感じにすれば任意のアイコンが表示できるかと
// ImageView imgView =
(ImageView)view.findViewById(R.id.rowicon);
// imgView.setImage(....)

return view;
}
}

参考になれば幸いです。

sanji03

unread,
Oct 4, 2010, 9:22:35 AM10/4/10
to 日本Androidの会
早速のご回答ありがとうございます。
現在、自分のアプリに組み込んでおりますが
なにぶん初心者なもので1コードずつ理解しながら進んでおります。
おって使用感等ご報告したいさせてと思います。・・・もしくはさらなる質問になるかもしれませんが。

ひとまず、ありがとうございます。

On 10月4日, 午前10:35, yokmama <hijirinhiji...@gmail.com> wrote:
> 夜子ままです
>
> ArrayAdapterはリスト内容を該当する項目のテキストに設定するだけなのでイメージの場合は
> ArrayAdapterを継承したクラスを作成するなどして、getViewにて各ImageViewにイメージを設定するしかありません。
>
> Imageを表示するAdapterのサンプルは
>
> http://developer.android.com/intl/ja/resources/tutorials/views/hello-...
>
> ここにあるImageAdapterが参考になるとおもいます、ただしこちらのサンプルは固定でイメージをもっていますので引数でイメージの配列をうけとってそれを使うようにする工夫がいります。
>
> 2010年10月3日21:10 sanji03 <osajir...@gmail.com>:
> > このグループから退会するには、android-group-j...@googlegroups.com<android-group-japan%2Bunsu...@googlegroups.com>にメールを送信してください。
> > 詳細については、http://groups.google.com/group/android-group-japan?hl=jaからこのグループにアクセスしてください。

sanji03

unread,
Oct 4, 2010, 9:30:08 AM10/4/10
to 日本Androidの会
ご回答ありがとうございます。
夜子ままさんに返信していただいたGridView以外にも
ListViewでの解決方法もあるとのことで、こちらも試めさせていただきたいと思っております。
・・・なにぶん初心者につき1コードずつ理解しながらですが。。

今まで一人で悩みもがきつつ、ググりながらアプリを作成してきましたが限界を感じ
当サイトに投稿させていただきましたがみなさまの暖かい返信に感謝いたします。
今後ともよろしくお願いします。

sanji03

unread,
Oct 5, 2010, 8:54:27 AM10/5/10
to 日本Androidの会
こんばんは。sanji03です。
昨日から夜子ままさんから教わったgetViewを試してみたのですが
リンク先のサンプルをそのまま実行させればイメージを表示することに成功したのですが
私のアプリケーション上のListViewと混在させようとするとどうもうまくいかず
何も表示しなくなってしまいました。おそらくxmlの構成をいじればよいような気がしますがスキル不足で
どこが悪いかの見当もつかず、getViewについては、今後ゆっくり勉強させていきたいと思います。
夜子ままさんありがとうございました。

私のアプリケーションのj構成からするとおそらく岩井さんより教わったサンプルのほうが現実に近いような気がしまして(素人の思いですが)
こちらでなんとか達成させていただきたいと思い、岩井さんのサンプルをそのまま実行し、表示に成功しました。

ただ、こちらのサンプルでは、iconが固定となっており、

テキストA + icon
テキストB + icon
テキストC + icon
テキストD + icon

の表示となりました。

私のやりたい表示は、
テキストA + icon1
テキストB + icon2
テキストC + icon3
テキストD + icon4

というようにテキストに対し違うアイコン表示にしたいので
mainの処理を以下のように変更してみました。

public class main extends Activity {
/** Called when the activity is first created. */

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.row);
// ListViewを作成
ListView listView = new ListView(getApplicationContext());

// レイアウトパラメータ
LinearLayout.LayoutParams param
= new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT);

// ListViewを載せる
addContentView(listView, param);

// ListViewに表示する適当なデータ
List<String> data = Arrays.asList(new String[]{"a", "b", "c",
"d"});

String id_name[] ={"icon","icon2","icon3","icon4"};
int id_no[]=new int[4];

for(int i =0 ;i<4;i++){
id_no[i] = getResources().getIdentifier(id_name[i],
"drawable", getPackageName());
}

List<int[]> data2 = Arrays.asList(id_no);


//そもそも↑↑↑↑↓↓↓↓↓こんな感じの書き方でよいでしょうか。
// 自作アダプタを作成
MyAdapter adpt = new MyAdapter(getApplicationContext(),
R.layout.row,data,data2);

// アダプタを設定
listView.setAdapter(adpt);

}
}

さらに自作アダプタのほうの記述の仕方がよくわかりませんでした。ためしに以下のように修正してみました。
public class MyAdapter extends ArrayAdapter<String>{

private LayoutInflater iInflater;
public MyAdapter(Context context, int
textViewResourceId,List<String> objects,List<int[]> objects2)
{
//superの宣言の仕方がよくわかりませんでした。。↓↓↓↓↓↓
super(context, textViewResourceId, objects);
iInflater =
(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

//getViewのaPosはtestViewのポジションと思いますがImageViewのアイコンについでのIDのポジションはどう記述すればよ
いでしょうか。

// 1行分のViewを取得/作成するとこ
public View getView(int aPos, final View aView, ViewGroup
aParent)
{
View view = aView;
if (view == null)
{
view = iInflater.inflate(R.layout.row, null);
}

// TextViewに文字列を表示
TextView txtView =
(TextView)view.findViewById(R.id.rowtext);
txtView.setText(getItem(aPos));

ImageView imgView
=(ImageView)view.findViewById(R.id.rowicon);
//ためしに以下のようにアイコンのIDからアイコンを呼び出そうとしましたが「objects2 cannot be resolved to a
variable」とエラーでおこられました。どう記述すればよいでしょうか。
imgView.setImageResource(objects2[aPos]);

return view;
}
}


ちなみにrow.xmlの<ImageView>内の
 android:src="@drawable/icon"
の記述は、コメントアウトしております。

以上、ご教示いただけないでしょうか。
よろしくお願いいたします。

yokmama

unread,
Oct 5, 2010, 9:14:15 AM10/5/10
to android-g...@googlegroups.com
夜子ままです

プログラムがなんだか複雑になっちゃってますね、もっと簡単にできますよ。

ArrayAdapter<String> のこのStringは別にStringじゃなくてもいいです。

だから、イメージと文字列をもったクラスを作るとすっきりします。

class ImageAndString{
    String text;
     int     image;
}

とたとえば、こんなクラスをつくって

public class MyAdapter extends ArrayAdapter<ImageAndString>{

とこうしちゃうわけです、
するとどうなるかというと

getViewでその表示位置のItemは

ImageAndString obj = getItem(aPos);

といった感じで取得できます。

コンストラクタは

public MyAdapter (Context context, List<ImageAndString> objects) {
super(context, 0, objects);
this.context = context;
this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

こんなかんじでいいです、引数のテンプレートは使わないので省略して、スーパークラスには適当に0をいれておけばいいです。


それと、話はもどってしまいますが。
GridViewもListViewも大本は同じクラスを継承していて兄弟みたいなものです、
そのためAdapterは同じものがつかえます、もちろんそれぞれの表示にあわせて変える必要はありますけど。

前のメールで紹介したImageAdapterはGridViewで使ってますがそのままListViewのAdapterに設定しても
問題ないですよ。

とこんなことをいったら混乱するか、、ArrayAdapterを継承するほうが簡単なのでこのまますすめたほうがいいとおもいます。






2010年10月5日21:54 sanji03 <osaj...@gmail.com>:
よろしくお願いいたします。

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。

osajiro

unread,
Oct 5, 2010, 10:55:12 AM10/5/10
to android-g...@googlegroups.com
お世話になります。sanji03です。

なるほど、すごくシンプルになりますね。
・・・その場合、main()の処理では、List<ImageAndString>の記述は、そのようにすればよいのでしょうか。
ちなみに

List<ImageAndString> text = Arrays.asList(new String[]{"a", "b", "c", "d"});
とやったら「型の不一致: List<String> から List<ImageAndString> には変換できません」となってしまいました。

ためしに
public class ImageAndString {
    static String text[];
    static int     image[];
}
とし、main()で
ImageAndString  imstr = new ImageAndString();
imstr.text = new String[]{"a", "b", "c", "d"};
として
MyAdapter adpt = new MyAdapter(getApplicationContext(),imstr);
としたら、
「コンストラクター MyAdapter(Context, ImageAndString) は未定義です」とのエラーになりました。

・・・・わからんちんですみません。

yokmama

unread,
Oct 5, 2010, 11:05:20 AM10/5/10
to android-g...@googlegroups.com
夜子ままです

MyAdapter に渡すデータをどうするかっていう話ですよね。

データは

ArrayList<ImageAndString> と言うものを作ります、
ArrayListはListのサブクラスなので実質同じだとおもってください。

作成のしかたは
ArrayList<ImageAndString> list = new ArrayList<ImageAndString>();

と言う感じでつくるわけですが、このままでは空っぽなのでデータをいれていきます。

データをどうつくるかについてそのシステムによってやりかたがかわってくるとおもいますが

String[] strlist = new String[]{"a", "b", "c", "d"};;
for(int i=0; strlist.length; i++){
ImageAndString data = new ImageAndString();
data.text = strlist[i];
data.image = ??? <- 文字列に対応したイメージ

list.add(data);
}

とこんなかんじで設定をして最後に

MyAdapter adpt = new MyAdapter(this, list);

で作成すればよいです。

2010年10月5日23:55 osajiro <osaj...@gmail.com>:

--

osajiro

unread,
Oct 5, 2010, 12:15:25 PM10/5/10
to android-g...@googlegroups.com
お世話になります。sanji03です。
夜子ままさん。ありがとうございます。
main()のほうは、ひとまず以下のようにしてエラーは出なくなりました。
*******************

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.row);
     // ListViewを作成
        ListView listView = new ListView(getApplicationContext());

        // レイアウトパラメータ
        LinearLayout.LayoutParams param
        = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,
        LayoutParams.FILL_PARENT);

        // ListViewを載せる
        addContentView(listView, param);

        // ListViewに表示する適当なデータ

        ArrayList<ImageAndString>list = new ArrayList<ImageAndString>();

        String[] strlist = new String[]{"a", "b", "c", "d"};;
        String id_name[] ={"icon","icon2","icon3","icon4"};
        int id_no[]=new int[4];

        for(int i=0; i<strlist.length; i++){

            ImageAndString data = new ImageAndString();
            data.text = strlist[i];
               id_no[i] = getResources().getIdentifier(id_name[i], "drawable", getPackageName());

            data.image = (int) id_no[i];

            list.add(data);

        }

        MyAdapter adpt = new MyAdapter(this, list);

    }
*******************************
ただ、・・・あれもこれもでたいへんもうしわけありませんが MyAdapter()のほうのエラーが出てしまいまして。List<ImageAndString>に修正する前のList<String>で使用していたgetViewをそのまま使用しましたところエラーがたくさんでてしまいまして。。はずかしながら自分が根本的な部分を理解できていないためと思いますが。//コメント部分です。


    public MyAdapter(Context context, List<ImageAndString> objects) {

         super(context, 0,objects);
         this.context = context;
         this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

//「パラメーター getView の修飾子が正しくありません。final のみが許可されています」とのエラー

          View getView(int aPos, final View aView, ViewGroup aParent){
              View view = aView;
              if (view == null)
              {
                  view = inflater.inflate(R.layout.row, null);
              }
              ImageAndString obj = getItem(aPos);

              /* TextViewに文字列を表示*/
              TextView txtView = (TextView)view.findViewById(R.id.rowtext);

//このような記述でよいのでしょうか
              txtView.setText((CharSequence) obj);


              ImageView imgView =(ImageView)view.findViewById(R.id.rowicon);
//「型 ImageView のメソッド setImageResource(int) は引数 (ImageAndString) に適用できません」とのエラーが出てしまいます。
              imgView.setImageResource(int obj);

//「void メソッドは値を戻すことができません」のエラーが出てしまいます。
              return view;
          }
    }


・・・申し訳ありませんがご教示のほど、よろしくお願いします。





2010年10月6日0:05 yokmama <hijirin...@gmail.com>:

yokmama

unread,
Oct 5, 2010, 12:23:55 PM10/5/10
to android-g...@googlegroups.com
夜子ままです


public View getView(int position, View convertView, ViewGroup parent) {

こんなかんじで final をつけてはいけません。


 txtView.setText((CharSequence) obj);
これは
 txtView.setText(obj.text);

 imgView.setImageResource(int obj);
これは
 imgView.setImageResource(obj.image);


これでどうでしょう?

2010年10月6日1:15 osajiro <osaj...@gmail.com>:

osajiro

unread,
Oct 6, 2010, 9:54:16 AM10/6/10
to android-g...@googlegroups.com
お世話になります。sanji03です。
夜子ままさん。昨日は遅くまでありがとうございました。

!!おかげさまでコンパイルが通るようになりました。
・・・ただ、アイコン、テキストともに何も表示されません。。
ただいま、デバッグ中ですが。。。
なにかお気づきの点がありましたらご教示ください。よろしくお願いいたします。
以下、コード全文です。


public class main extends Activity {
    /** Called when the activity is first created. */

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.row);
     // ListViewを作成
        ListView listView = new ListView(getApplicationContext());

        // レイアウトパラメータ
        LinearLayout.LayoutParams param
        = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,
        LayoutParams.FILL_PARENT);

        // ListViewを載せる
        addContentView(listView, param);

        // ListViewに表示する適当なデータ

        ArrayList<ImageAndString>list = new ArrayList<ImageAndString>();

        String[] strlist = new String[]{"a", "b", "c", "d"};
        String id_name[] ={"icon","icon2","icon3","icon4"};
        int id_no[]=new int[4];

        for(int i=0; i<strlist.length; i++){
            ImageAndString data = new ImageAndString();
            data.text = strlist[i];
               id_no[i] = getResources().getIdentifier(id_name[i], "drawable", getPackageName());

            data.image = (int) id_no[i];

            list.add(data);
        }

       MyAdapter adpt = new MyAdapter(this, list);

    }
}

public class ImageAndString {
    String text;
    int    image;
}



public class MyAdapter extends ArrayAdapter<ImageAndString> {


    private Context context;
    private LayoutInflater inflater;


    public  MyAdapter(Context context, List<ImageAndString> objects) {
         super(context, 0,objects);
         this.context = context;
         this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);


    }
     public View getView(int position,View convertView, ViewGroup parent){
         View view = convertView;

      if (view == null)
      {
          view = inflater.inflate(R.layout.row, null);
      }

      ImageAndString obj = getItem(position);



      // TextViewに文字列を表示
      TextView txtView = (TextView)view.findViewById(R.id.rowtext);
      txtView.setText(obj.text);

      //こんな感じにすれば任意のアイコンが表示できるかと

      ImageView imgView =(ImageView)view.findViewById(R.id.rowicon);

      imgView.setImageResource(obj.image);

      return view;
  }
}

【row.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="wrap_content"
   >

<TextView
   android:id="@+id/rowtext"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   />

   <ImageView
   android:id="@+id/rowicon"
   android:layout_height="fill_parent"
   android:layout_width="wrap_content"
   />

</LinearLayout>

【AndroidManifest.xml】

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.android.img"
      android:versionCode="1"
      android:versionName="1.0">
    <application  android:label="@string/app_name">
        <activity android:name=".main"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>


</manifest>


2010年10月6日1:23 yokmama <hijirin...@gmail.com>:

osajiro

unread,
Oct 6, 2010, 10:16:20 AM10/6/10
to android-g...@googlegroups.com
お世話になります。sanji03です。
自己レスです。

main()の最後に
listView.setAdapter(adpt);
をセットするのを忘れてました。
お騒がせしました。

・・・ただ、このコードだと、

        String[] strlist = new String[]{"a", "b", "c", "d"};
        String[] id_name = new String[]{"icon","icon2","icon3","icon4"};
と順番に表示したいのですが

テキスト d アイコン4
テキスト d アイコン4
テキスト d アイコン4
テキスト d アイコン4

と、なってしまいました。
配列のループ処理に問題があるのでしょうか。。
ご教示ください。

2010年10月6日22:54 osajiro <osaj...@gmail.com>:

Tomoki Iwai

unread,
Oct 6, 2010, 7:48:46 PM10/6/10
to 日本Androidの会
岩井です。

おそらく、下記ディレクトリに
icon1.png, icon2.png, icon3.png, icon4.pngといった
画像ファイルを入れ忘れているのではないでしょうか?

drawable-hdpi
drawable-ldpi
drawable-mdpi

これが入っているのであれば、以下のコードが
コンパイルエラーにならないはずです。

--------------
一部抜粋
--------------


// ListViewに表示する適当なデータ
ArrayList<ImageAndString> list = new ArrayList<ImageAndString>();
String[] strlist = new String[] { "a", "b", "c", "d" };

// ここをコメントアウト
//String id_name[] = { "icon", "icon2", "icon3", "icon4" };

// ここはちょっと改造
int id_no[] = new int[]{R.drawable.icon1, R.drawable.icon2,
R.drawable.icon3, R.drawable.icon4};
for (int i = 0; i < strlist.length; i++)


{
ImageAndString data = new ImageAndString();
data.text = strlist[i];

// ここをコメントアウト
//id_no[i] = getResources().getIdentifier(id_name[i], "drawable",
getPackageName());
data.image = id_no[i];
list.add(data);
}
--------------

On 10月6日, 午後11:16, osajiro <osajir...@gmail.com> wrote:
> お世話になります。sanji03です。
> 自己レスです。
>
> main()の最後に
> listView.setAdapter(adpt);
> をセットするのを忘れてました。
> お騒がせしました。
>
> ・・・ただ、このコードだと、
> String[] strlist = new String[]{"a", "b", "c", "d"};
> String[] id_name = new String[]{"icon","icon2","icon3","icon4"};
> と順番に表示したいのですが
>
> テキスト d アイコン4
> テキスト d アイコン4
> テキスト d アイコン4
> テキスト d アイコン4
>
> と、なってしまいました。
> 配列のループ処理に問題があるのでしょうか。。
> ご教示ください。
>

> 2010年10月6日22:54 osajiro <osajir...@gmail.com>:

> > 2010年10月6日1:23 yokmama <hijirinhiji...@gmail.com>:


>
> > 夜子ままです
>
> >> public View getView(int position, View convertView, ViewGroup parent) {
>
> >> こんなかんじで final をつけてはいけません。
>
> >> txtView.setText((CharSequence) obj);
> >> これは
> >> txtView.setText(obj.text);
>
> >> imgView.setImageResource(int obj);
> >> これは
> >> imgView.setImageResource(obj.image);
>
> >> これでどうでしょう?
>

> >> 2010年10月6日1:15 osajiro <osajir...@gmail.com>:

> >>> 2010年10月6日0:05 yokmama <hijirinhiji...@gmail.com>:


>
> >>> 夜子ままです
>
> >>>> MyAdapter に渡すデータをどうするかっていう話ですよね。
>
> >>>> データは
>
> >>>> ArrayList<ImageAndString> と言うものを作ります、
> >>>> ArrayListはListのサブクラスなので実質同じだとおもってください。
>
> >>>> 作成のしかたは
> >>>> ArrayList<ImageAndString> list = new ArrayList<ImageAndString>();
>
> >>>> と言う感じでつくるわけですが、このままでは空っぽなのでデータをいれていきます。
>
> >>>> データをどうつくるかについてそのシステムによってやりかたがかわってくるとおもいますが
>
> >>>> String[] strlist = new String[]{"a", "b", "c", "d"};;
> >>>> for(int i=0; strlist.length; i++){
> >>>> ImageAndString data = new ImageAndString();
> >>>> data.text = strlist[i];
> >>>> data.image = ??? <-
>

> ...
>
> もっと読む ≫

osajiro

unread,
Oct 7, 2010, 9:22:49 AM10/7/10
to android-g...@googlegroups.com
こんばんは。お世話になります。sanji03です。
岩井さんありがとうございます。

> drawable-hdpi
> drawable-ldpi
> drawable-mdpi

上記フォルダとはどこにあるのでしょう。

わたしのプロジェクトの構成では、
imgstring(プロジェクトルート)/res/drawable
の下に icon,icon2,icon3,icon4を入れています。
ファイル形式は、pngではなくgifですが。

・・・ご指摘いただいたコードに変更しコンパイルエラーなく通ったのですが結果は変わらず


テキスト d アイコン4
テキスト d アイコン4
テキスト d アイコン4
テキスト d アイコン4

のままでした。。

んーー継続デバッグ中です。

何か他にお気づきの点等ありましたら
ご指摘いただければ幸いです。
よろしくお願いいたします。

2010年10月7日8:48 Tomoki Iwai <tomok...@gmail.com>:

yokmama

unread,
Oct 7, 2010, 9:48:44 AM10/7/10
to android-g...@googlegroups.com
夜子ままです

岩井さんのアドバイスで、大丈夫だろうなーとおもったのに、
だめでしたか、、残念です。

> drawable-hdpi
> drawable-ldpi
> drawable-mdpi

これは、画像ファイルをAndroid端末の画面の解像度にあわせて画像等を準備するためのフォルダなので。
全種対応のdrawableにおいているのでしたら問題ないです。

png でも gif でも表示されます。(アニメーションGIFはアニメしません)


テキスト d アイコン4
テキスト d アイコン4
テキスト d アイコン4
テキスト d アイコン4

こういう結果なので、Adapterでデータの設定を間違っているんじゃないのかなとおもったのですが、
添付しているプログラムをみるかぎり問題はなさそうですね、、なにか見落としがあるようなきがしますけど。

一応勘違いしないようにひとつ説明

setImageResource(int id)

このメソッドは、引数にリソースIDを指定します。

リソースIDというのは R.javaに定義されているIDなんですが、
このIDは自動生成されますので自分で修正するファイルじゃありません。

res/ の下に置いたファイル、例えば画像だったら

drawable/icon1.gif

というのをおいたら

R.java に

    public static final class drawable {
        public static final int icon1=0x7f020000;  <-- drawable は拡張子をのぞいたファイル名が変数名になる。
                                 そのため、ファイル名に変数名に使えないものを使ってると
                                 コンパイルエラーになります。
    }

というのを自動生成してくれます、この数字がリソースIDなんですね。

だから、setImageResourceの引数に指定するのは、そのリソースIDの変数である、R.drawable.icon1 というふうになるわけです。
※ static 変数なので クラス名から直接使えます。

というわけで、何個か前のメールで

String[] id_name = new String[]{"icon","icon2","icon3","icon4"};
としてたけど、

int[] id = new int[]{R.drawable.icon, R.drawable.icon2, R.drawable.icon3, R.drawable.icon4};

としておけば、ImageAndStringを作成するときに

ImageAndString  img = new ImageAndString();
img.images = id[0];  

とリソースIDで渡しておけば、getView のところで

setImageResource(img.image);

とそのまま渡せるはずです。


# ImageAndStringていうクラス名はかっこ悪いので、ちゃんと意味のある名前にしといたほうがいいですよ、
適当な名前でソースをかいてしまい、すみません。


2010年10月7日22:22 osajiro <osaj...@gmail.com>:

Yuki Anzai

unread,
Oct 7, 2010, 10:10:21 AM10/7/10
to android-g...@googlegroups.com
sanji03 さん

 こんばんは。
 あんざいです。

 これが原因かわかりませんが、
 いくつか気になる点があります。

 ・ この場合Activity ではなく、 ListActivity を継承したほうがすっきりし
ます。

 ・Adapter の getView で inflate するときに
  view = inflater.inflate(R.layout.row, null);
 だとうまくいかないってどこかのサイトでみたきが、、、
  view = inflater.inflate(R.layout.row, parent, false);
 にするといいはず


現状にそった形で動作確認済みのサンプルです。
テストしたのは png ですが、 gif でも大丈夫(なはず)


ListViewImageTest.java
------------------------------
package yanzm.example.listviewimagetest;

import java.util.ArrayList;
import java.util.List;

import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class ListViewImageTest extends ListActivity {

@Override


public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// ListViewに表示する適当なデータ


String[] strlist = new String[] { "a", "b", "c", "d" };

int id_no[] = new int[] { R.drawable.icon1, R.drawable.icon2,
R.drawable.icon3, R.drawable.icon4 };

ArrayList<ImageAndString> list = new ArrayList<ImageAndString>();


for (int i = 0; i < strlist.length; i++) {
ImageAndString data = new ImageAndString();
data.text = strlist[i];

data.image = id_no[i];
list.add(data);
}

setListAdapter(new MyAdapter(this, list));
}

class ImageAndString {
String text;
int image;
}

public class MyAdapter extends ArrayAdapter<ImageAndString> {

private LayoutInflater inflater;

public MyAdapter(Context context, List<ImageAndString> objects) {
super(context, 0, objects);

this.inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder;

if (convertView == null) {
convertView = inflater.inflate(R.layout.row, parent, false);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.rowtext);
holder.image = (ImageView) convertView
.findViewById(R.id.rowicon);

convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
ImageAndString obj = getItem(position);
holder.text.setText(obj.text);
holder.image.setImageResource(obj.image);

return convertView;
}
}

static class ViewHolder {
TextView text;
ImageView image;
}
}

row.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="wrap_content"
>
<TextView
android:id="@+id/rowtext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<ImageView
android:id="@+id/rowicon"
android:layout_height="fill_parent"
android:layout_width="wrap_content"
/>
</LinearLayout>


 


 ---
あんざいゆき
anzai...@gmail.com
twtte : yanzm

  
> こんばんは。お世話になります。sanji03です。
> 岩井さんありがとうございます。
>
> > drawable-hdpi
> > drawable-ldpi
> > drawable-mdpi
>
> 上記フォルダとはどこにあるのでしょう。
>
> わたしのプロジェクトの構成では、
> imgstring(プロジェクトルート)/res/drawable
> の下に icon,icon2,icon3,icon4を入れています。
> ファイル形式は、pngではなくgifですが。
>
> ・・・ご指摘いただいたコードに変更しコンパイルエラーなく通ったのですが
> 結果は変わらず
>
> テキスト d アイコン4
> テキスト d アイコン4
> テキスト d アイコン4
> テキスト d アイコン4
>
> のままでした。。
>
> んーー継続デバッグ中です。
>
> 何か他にお気づきの点等ありましたら
> ご指摘いただければ幸いです。
> よろしくお願いいたします。
>
> 2010年10月7日8:48 Tomoki Iwai <tomok...@gmail.com

> <mailto:tomok...@gmail.com>>:

> <mailto:osajir...@gmail.com>> wrote:
> > お世話になります。sanji03です。
> > 自己レスです。
> >
> > main()の最後に
> > listView.setAdapter(adpt);
> > をセットするのを忘れてました。
> > お騒がせしました。
> >
> > ・・・ただ、このコードだと、
> > String[] strlist = new String[]{"a", "b", "c", "d"};
> > String[] id_name = new String[]{"icon","icon2","icon3","icon4"};
> > と順番に表示したいのですが
> >
> > テキスト d アイコン4
> > テキスト d アイコン4
> > テキスト d アイコン4
> > テキスト d アイコン4
> >
> > と、なってしまいました。
> > 配列のループ処理に問題があるのでしょうか。。
> > ご教示ください。
> >
> > 2010年10月6日22:54 osajiro <osajir...@gmail.com

> <mailto:osajir...@gmail.com>>:

> <mailto:hijirinhiji...@gmail.com>>:


> >
> > > 夜子ままです
> >
> > >> public View getView(int position, View convertView, ViewGroup
> parent) {
> >
> > >> こんなかんじで final をつけてはいけません。
> >
> > >> txtView.setText((CharSequence) obj);
> > >> これは
> > >> txtView.setText(obj.text);
> >
> > >> imgView.setImageResource(int obj);
> > >> これは
> > >> imgView.setImageResource(obj.image);
> >
> > >> これでどうでしょう?
> >
> > >> 2010年10月6日1:15 osajiro <osajir...@gmail.com

> <mailto:osajir...@gmail.com>>:

> <mailto:hijirinhiji...@gmail.com>>:


> >
> > >>> 夜子ままです
> >
> > >>>> MyAdapter に渡すデータをどうするかっていう話ですよね。
> >
> > >>>> データは
> >
> > >>>> ArrayList<ImageAndString> と言うものを作ります、
> > >>>> ArrayListはListのサブクラスなので実質同じだとおもってください。
> >
> > >>>> 作成のしかたは
> > >>>> ArrayList<ImageAndString> list = new
> ArrayList<ImageAndString>();
> >
> > >>>> と言う感じでつくるわけですが、このままでは空っぽなのでデー
> タをいれていきます。
> >
> > >>>> データをどうつくるかについてそのシステムによってやりかたが
> かわってくるとおもいますが
> >
> > >>>> String[] strlist = new String[]{"a", "b", "c", "d"};;
> > >>>> for(int i=0; strlist.length; i++){
> > >>>> ImageAndString data = new ImageAndString();
> > >>>> data.text = strlist[i];
> > >>>> data.image = ??? <-
> >
> > ...
> >
> > もっと読む ≫
>
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者
> に送られています。
> このグループに投稿するには、android-g...@googlegroups.com

> <mailto:android-g...@googlegroups.com> にメールを送信してく
> ださい。
> このグループから退会するには、android-group-japan+
> unsub...@googlegroups.com
> <mailto:android-group-japan%2Bunsu...@googlegroups.com> にメー
> ルを送信してください。
> 詳細については、http://groups.google.com/group/android-group-
> japan?hl=ja からこのグループにアクセスしてください。


>
>
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送
> られています。
> このグループに投稿するには、android-g...@googlegroups.com
> メールを送信してください。

> このグループから退会するには、android-group-japan+
> unsub...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=
> ja からこのグループにアクセスしてください。

osajiro

unread,
Oct 7, 2010, 10:34:29 AM10/7/10
to android-g...@googlegroups.com
お世話になります。sanji03です。
夜子ままさんimgView.setImageResource()のご丁寧な解説ありがとうございます。よくわかりました。
あんざいさん。わざわざサンプルを再現していただきありがとうございました。
このサンプルを参考に再度チェックしたところ、

できました!!!

・・・うまくいかなかった原因は。。。
・・・・みなさま大変申し訳ありません。
・・・わたしの記述ミスでした。

いろいろあーでもないこーでもないとソースをいじっている間にためしに


ImageAndString data = new ImageAndString();
for (int i = 0; i < strlist.length; i++) {
//ImageAndString data = new ImageAndString();
data.text = strlist[i];
data.image = id_no[i];
list.add(data);
}

と、書き換えてしまってました。

・・・ImageAndStringのインスタンスdataをforループの外に出してしまいました。
はずかしながら、インスタンスをforループ内においておく意味がよくわからず
これでも問題ないのでは?と、かってに思ってしまいまして。
インスタンスとは、その都度更新しないといけないものなのですね。
あーーー。すみませんでした。

みなさまの温かいご支援・ご声援でやっと、アイコンとテキストの表示に成功いたしました。
ほんとにありがとうございました。

これから自分のアプリに組み込んで見ます。

今後ともよろしくお願いします。


2010年10月7日23:10 Yuki Anzai <anzai...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages