ImageViewとTextViewをGridView/ListViewアダプタに動的に取り込むにはどうしたらいいですか?

私は最初のアプリを開発していて、何かにはまっています。そこにはたくさんの例がありますが、私がしなければならないことを正確にやっている人はいません。私が見つけたものを適応できる知識ベースが欠けています。

ImageViewとTextViewを同じグリッド/リスト行に表示するGridView/ListViewを作成しようとしており、画像とテキストがスクロール中に行上で動的に更新されています。リストの各グリッド/行には異なるイメージとテキストがあります(これらは配列から取り込まれます)。スクロール時に行を正しく再利用して、アプリのメモリを低く抑えています。イメージはRes.Drawableフォルダに保存されます。私がしようとしていることの一例は、WOW Armoryアプリケーションのメイン画面です。

私は次の例を見て、それが答えだと信じていますが、実装する方法はわかりません:

http://developer.android .com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html

私が最初に抱える問題は、アダプタでImageViewsを処理し、次の部分はアダプタが動作した後にMainActivityを設定することです。どんな助力も大変ありがとうと思います。ここに私がこれまで持っているコードはあります:

アダプタ:

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class MainButtonAdapter extends BaseAdapter {
    private static ArrayListarraylist;
    private LayoutInflater mInflater;

    public MainButtonAdapter(Context context, ArrayListinput) {        
        arraylist = input;
        mInflater = LayoutInflater.from(context);
    }    

    public int getCount() {        
        return arraylist.size();    
    }    

    public Object getItem(int position) {        
        return arraylist.get(position);    
    }    

    public long getItemId(int position) {        
        return position;    
    } 

   //create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {        
        ViewHolder holder;        
        if (convertView == null) {  
            convertView = mInflater.inflate(R.layout.main_button_layout, null);
            holder = new ViewHolder();
            holder.icon = (ImageView)convertView.findViewById(R.id.ImageViewButton);
            holder.text = (TextView)convertView.findViewById(R.id.TextViewButton);
            convertView.setTag(holder);

        } 
        else {
            holder = (ViewHolder)convertView.getTag();
        }
        holder.icon.setImageResource(arraylist.get(position).getIcon());
        holder.text.setText(arraylist.get(position).getIcontxt());
        return convertView;
    }
    static class ViewHolder {
        ImageView icon;
        TextView text;
    }
}

オブジェクト:

public class MainButtonObject {
    private String icon;
    private String icontxt;

    public MainButtonObject(String icon, String icontxt) {
        this.icon = icon;
        this.icontxt = icontxt;
        }

    public String getIcon() {
    return icon;
    }

    public void setIcon(String icon) {
        this.icon = icon;
    }

    public String getIcontxt() {
        return icontxt;
    }

    public void setIcontxt(String icontxt) {
        this.icontxt = icontxt;
    }
}

文字列配列:

<?xml version="1.0" encoding="utf-8"?>

    
        icon1.png
        item 1
    
    
        icon2.png
        item 2
    
    
        icon3.png
        item 3
    
    
        icon4.png
        item 4
    

ビューの標準レイアウト:

<?xml version="1.0" encoding="utf-8"?>


    
    
    
    

最後に、MainActivity:

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.Toast;


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

@Override
public void onCreate(Bundle savedInstanceState) {    
    super.onCreate(savedInstanceState);    
    setContentView(R.layout.main);    

    GridView gridview = (GridView) findViewById(R.id.gridview);    
    gridview.setAdapter(new MainButtonAdapter(this));    

    gridview.setOnItemClickListener(new OnItemClickListener() {        
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {            
            Toast.makeText(MainActivity.this, "" + position, Toast.LENGTH_SHORT).show();        
        }    
    });
}
} 
2
行を再利用することを心配しないでください。Androidはこれを行います。 :) Androidは、スクロールしながら、ユーザーに見えるようにすることができる多くの行だけを割り当て、単純にそれらをリサイクルします。 getView メソッドに気付いたら、 convertView が再利用されているか、まだ初期化されていない場合に最初にチェックされます。
追加された 著者 st0le,

1 答え

あなたのソースからは、複数の配列を持っているように見え、それぞれはイメージをテキストにマッピングします。基本的に、同じ行にイメージとテキストを表示するグリッド表示ですか?グリッドビューは最善の選択ではないかもしれません。リストビューがおそらくより良い選択です。テキストとイメージビューを含むカスタム行を含むリストビュー。

あなたのコードでは、あなたが意図的にそれを放置しない限り、実際に使用されている配列は表示されません。また、あなたはこのようにあなたのアダプタを初期化しました...

new MainButtonAdapter(this)

あなたのアダプターはコンテキストとArrayListを取ります...

public MainButtonAdapter(Context context, ArrayListinput)

だからまず、あなたの文字列配列をオブジェクトに取得します...

String[] item1 = getResources().getStringArray(R.array.item1);
String[] item2 = getResources().getStringArray(R.array.item2);
String[] item3 = getResources().getStringArray(R.array.item3);
String[] item4 = getResources().getStringArray(R.array.item4);

そして、それらの配列からMainButtonObjectを作成してください...

MainButtonObject mbo1 = new MainButtonObject(item1[0],item1[1]);
MainButtonObject mbo2 = new MainButtonObject(item2[0],item2[1]);
MainButtonObject mbo3 = new MainButtonObject(item3[0],item3[1]);
MainButtonObject mbo4 = new MainButtonObject(item4[0],item4[1]);

そして、それらのすべてをArrayListに追加します...

ArrayList list = new ArrayList();
list.add(mbo1);
list.add(mbo2);
list.add(mbo3);
list.add(mbo4);

そして、アダプタを作成/設定します

gridview.setAdapter(new MainButtonAdapter(this,list));

アダプターで、私はあなたが気づいた...

holder.icon.setImageResource(arraylist.get(position).getIcon());

Which is a String and is not valid in this case since setImageResource() takes in an integer that is the ID of the resource you want to access: http://developer.android.com/reference/android/widget/ImageView.html#setImageResource(int)

アイコンはres/drawableディレクトリにある必要があり、R.drawable.icon1などでアクセスできます。

私はこれがあなたが探している答えかどうかわからないが、私はそれが助けて欲しい:)

2
追加された
とても助かりました。ありがとうございました!
追加された 著者 gcofieldd,