2011-12-19 19 views
2

私は最初のアプリを開発しており、何かにはまっています。そこにはたくさんの例がありますが、私がしなければならないことを正確にやっている人はいません。私が見つけたものを適応できる知識ベースが欠けています。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 ArrayList<MainButtonObject>arraylist; 
    private LayoutInflater mInflater; 

    public MainButtonAdapter(Context context, ArrayList<MainButtonObject>input) {   
     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"?> 
<resources> 
    <string-array name="item1"> 
     <item>icon1.png</item> 
     <item>item 1</item> 
    </string-array> 
    <string-array name="item2"> 
     <item>icon2.png</item> 
     <item>item 2</item> 
    </string-array> 
    <string-array name="item3"> 
     <item>icon3.png</item> 
     <item>item 3</item> 
    </string-array> 
    <string-array name="item4"> 
     <item>icon4.png</item> 
     <item>item 4</item> 
    </string-array> 
</resources> 

標準レイアウト:

ここで私がこれまで持っているコードです。
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:gravity="center_horizontal" 
    android:background="@drawable/background_main_button" > 

    <ImageView 
     android:id="@+id/ImageViewButton" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
    </ImageView> 
    <TextView 
     android:id="@+id/TextViewButton" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingTop="2dp"> 
    </TextView> 
</LinearLayout> 

そして最後に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();   
     }  
    }); 
} 
} 
+0

Androidがあなたのためにそれを行うだろう、再using'行 '心配しないでください。 :) Androidは、スクロールしながら、ユーザーに見えるようにすることができる多くの行だけを割り当て、単純にそれらをリサイクルします。 'getView'メソッドに気付いたら、' convertView'が再利用されているかまだ初期化されていないかどうかをチェックします。 – st0le

答えて

2

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

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

new MainButtonAdapter(this) 

を初期化してきましたが、あなたのアダプタは、私はあなたの文字列になるだろう、

public MainButtonAdapter(Context context, ArrayList<MainButtonObject>input) 

そうで開始する...コンテキストとのArrayListになりますオブジェクトに配列...

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<MainButtonObject> list = new ArrayList<MainButtonObject>(); 
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()); 

文字列であり、この場合には有効ではありませんsetImageResource()は、アクセスしたいリソースのIDである整数を取ります:http://developer.android.com/reference/android/widget/ImageView.html#setImageResource(int)

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

これはあなたが探している答えである場合、私は知らないが、私はそれが役に立てば幸いです:)

+0

それは非常に有用でしたありがとう! – gcofieldd

関連する問題