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:
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();
}
});
}
}
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