2011-12-19 5 views
2

Je travaille sur ma première application, et je suis coincé sur quelque chose. Il y a beaucoup d'exemples, mais aucun ne fait exactement ce que je dois faire et je n'ai pas la base de connaissances pour pouvoir adapter ce que j'ai trouvé. J'essaie de créer un GridView/ListView qui affiche un ImageView et TextView dans la même ligne de grille/liste et l'image et le texte sont mis à jour dynamiquement sur la ligne pendant le défilement. Il y a une image et un texte différents pour chaque grille/ligne de la liste (ils sont remplis à partir d'un tableau) et je veux m'assurer que je réutilise correctement les lignes pendant le défilement pour garder la mémoire de l'application basse. Les images sont stockées dans le dossier Res.Drawable. Un exemple de ce que j'essaie de faire serait l'écran principal de l'application WOW Armory.Comment remplir dynamiquement ImageView et TextView sur mon adaptateur GridView/ListView?

je cherche l'exemple suivant et je crois que c'est la réponse, mais je ne sais pas comment la mettre en œuvre:

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

Le premier problème que j'ai manipule les ImageViews dans l'adaptateur et la partie suivante configurent MainActivity après le fonctionnement de l'adaptateur. Toute aide serait grandement appréciée et merci d'avance. Voici le code que j'ai jusqu'à présent:

Adaptateur:

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; 
    } 
} 

Objet:

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; 
    } 
} 

Chaîne-Array:

<?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> 

layout Standard pour les vues:

<?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> 

Enfin Le 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

Ne vous inquiétez pas sur les lignes 're-using', Android fera pour vous. :) Android alloue uniquement les nombreuses lignes qui peuvent être rendues visibles par l'utilisateur, tout en le faisant défiler, il les recycle simplement. Si vous remarquez la méthode 'getView', vous remarquerez que' convertView' est d'abord vérifié s'il est réutilisé ou non initialisé. – st0le

Répondre

2

de votre source, il semble que si vous avez plusieurs tableaux, chacun mappage d'une image à un texte. Et ce que vous voulez est fondamentalement une vue de la grille pour afficher l'image et le texte sur la même ligne? Une vue en grille n'est peut-être pas le meilleur choix, une vue en liste est probablement un meilleur choix. Une vue de liste avec une ligne personnalisée contenant du texte et une vue d'image.

Dans votre code, je ne vois pas le tableau en cours d'utilisation, sauf si vous l'avez laissé exprès. En outre, vous avez initialisé votre carte comme ça ...

new MainButtonAdapter(this) 

mais votre adaptateur prend dans un contexte et un ArrayList ...

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

Donc, pour commencer, je recevrais votre chaîne tableaux en objets ...

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); 

Et puis créer un MainButtonObject de ces tableaux ...

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]); 

Et puis ajoutez tous ceux à un ArrayList ...

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

Et puis créer/définir votre adaptateur

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

l'adaptateur, je remarqué que vous avez ...

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

Ce qui est une chaîne et n'est pas valable dans ce cas depuis setImageResource() prend un entier qui est l'ID de la ressource que vous voulez accéder:

Donc les icônes doivent être dans votre répertoire res/drawable et ensuite vous pouvez y accéder via, R.drawable.icon1 et ainsi de suite.

Je ne sais pas si cela est la réponse que vous cherchez, mais je ne l'espère :) aide

+0

C'était très utile merci! – gcofieldd

Questions connexes