Des éléments à l'intérieur GridView se répète lorsque l'écran défile
Je suis à l'aide d'un GridView pour afficher un ensemble de Catégories que l'utilisateur peut choisir. Chaque élément de la grille est constituée par une ImageView et un TextView, à la fois récupérées à partir du serveur. Lorsqu'un élément est touché, une autre activité est commencé.
Je pensais que tout va bien se passer, jusqu'à ce que j'ai remarqué que certains itens ont été se répète lorsque j'ai fait défiler l'écran. Chaque fois que j'ai faites défiler vers le bas à travers la grille, et puis sur le dos, itens changement itś position et obtenir dupliqué. Mais même quand je touche l'foiré itens, les valeurs de droite sont à envoyer à l'activité suivante.
À la recherche dans le LogCat, toute demande répétée du serveur se produit. En fait, j'ai obtenu ce lors du défilement:
06-28 12:36:38.554: D/dalvikvm(358): GC_EXTERNAL_ALLOC freed 2061 objects / 156024 bytes in 51ms
06-28 12:36:42.915: D/dalvikvm(358): GC_FOR_MALLOC freed 6590 objects / 737528 bytes in 57ms
06-28 12:38:26.725: D/dalvikvm(358): GC_EXTERNAL_ALLOC freed 5426 objects / 468176 bytes in 71ms
06-28 12:38:26.875: D/dalvikvm(358): GC_EXTERNAL_ALLOC freed 409 objects / 17480 bytes in 68ms
Ressemble à chaque fois que je scroll, itens obtenir redessiner...
Mise à JOUR: Il ne redessiner itens sur la première fois que j'ai faites défiler la GridView. Après cela, tous les itens, y compris répétée ceux, continue sur ses lieux.
Ma classe java:
public void proccess(){
int qtdCategorias = json.length();
imagens = new Drawable[qtdCategorias];
categorias = new String[qtdCategorias];
for (int i=0; i<qtdCategorias; i++){
JSONArray c = json.optJSONArray(i);
String urlAmigavel = null;
String imagemSite = null;
String nomeCategoria = null;
try {
urlAmigavel = c.getString(6);
imagemSite = c.getString(3);
nomeCategoria = c.getString(2);
} catch (JSONException e) {
Log.e("CategoriasJogarActivity", e.toString());
e.printStackTrace();
}
categorias[i] = nomeCategoria;
imagens[i] = getImagem(urlAmigavel, imagemSite);
}
gridview = (GridView) findViewById(R.id.include3);
ImageAdapter imageAdapter = new ImageAdapter(ctx, imagens, categorias);
gridview.setAdapter(imageAdapter);
gridview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
String name = null;
String idt = null;
try {
JSONArray c = json.optJSONArray(position);
name = c.getString(2);
idt = c.getString(0);
} catch (JSONException e) {
Log.e("CategoriasJogarActivity",
"JSONException" + e.toString());
}
Intent in = new Intent(getApplicationContext(),
JogarActivity.class);
in.putExtra(TAG_NAME, name);
in.putExtra(TAG_ID, idt);
in.putExtra(TAG_PRIMEIRAPERGUNTA, true);
startActivity(in);
}
});
}
public Drawable getImagem(String urlAmigavel, String img) {
String url = "http://www.qranio.com/pergunta/" + urlAmigavel + "/"+ img;
InputStream is = null;
try {
URL urlImagem = new URL(url);
is = (InputStream) getObjeto(urlImagem);
} catch (MalformedURLException e1) {
Log.e("CategoriasJogarActivity", e1.toString());
e1.printStackTrace();
}
Drawable d = Drawable.createFromStream(is, "src");
return d;
}
private Object getObjeto(URL url) {
Object content = null;
try {
content = url.getContent();
} catch (IOException e) {
Log.e("CategoriasJogarActivity", e.toString());
e.printStackTrace();
}
return content;
}
imageAdapter classe
public class ImageAdapter extends BaseAdapter{
private Context mContext;
private final Drawable[] mThumbIds;
private final String[] mTextIds;
public ImageAdapter(Context c, Drawable[] d, String[] s) {
mContext = c;
mThumbIds = d;
mTextIds = s;
}
public int getCount() {
return mThumbIds.length;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
//create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
//ImageView imageView;
View v;
if (convertView == null) { //if it's not recycled, initialize some attributes
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
v = inflater.inflate(R.layout.gridview_item_layout, null);
TextView text = (TextView)v.findViewById(R.id.grid_item_text);
text.setText(mTextIds[position]);
ImageView image = (ImageView)v.findViewById(R.id.grid_item_image);
image.setImageDrawable(mThumbIds[position]);
} else {
v = (View) convertView;
}
return v;
}
}
gridview_item_layout xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview_item_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal" >
<ImageView android:id="@+id/grid_item_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="fitCenter"
android:minHeight="100dip"
android:minWidth="100dip"
>
</ImageView>
<TextView android:id="@+id/grid_item_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="TextView"
android:gravity="center"
android:textColor="#F9A512"
android:textStyle="bold"
android:textSize="18dp"
>
</TextView>
</LinearLayout>
gridview xml
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:numColumns="auto_fit"
android:verticalSpacing="10dip"
android:horizontalSpacing="10dip"
android:stretchMode="columnWidth"
android:gravity="center"
android:background="#FFFFFF"
android:padding="5dip"
/>
J'ai vu d'autres questions à propos de cette même question, mais aucun d'entre eux ont répondu. Toutes les idées de ce qui se passe?
- Utilisation ViewHolder est de bonne pratique de code
Vous devez vous connecter pour publier un commentaire.
C'est normal que tu vois les mêmes éléments que vous faites défiler la
GridView
parce que dans legetView
méthode vous définissez l'un drawable pour laImageView
uniquement lorsque leconvertView
estnull
(par exemple pour les premiers éléments qui sont visibles lorsque laGridView
apparaissent à l'écran). Si leconvertView
n'est pasnull
, ce qui signifie que vous avez une recyclés ligne de vue, vous ne définissez pas la bonne image, et vous restez avec l'image qui a été précédemment installé sur cette recyclé vue. Essayez de modifier lesgetView
méthode comme ceci:Clic sur un élément, vous montre les éléments corrects parce que vous utilisez le
position
paramètre pour récupérer les données.GridView
de lag). Gardez à l'esprit que vous êtes à l'interrogation de ces images et aussi garder en mémoire(je ne sais pas combien vous en avez).TextView
par programmation. La solution est un peu différent. Par exemple, (en Supposant que vous avez un LinearLayout)LinearLayout linearLayout = (LinearLayout)v.findViewById(R.id.NAME_OF_YOUR_LINEARLAYOUT); linearLayout.removeAllViews(); TextView textViewDay = new TextView(mContext); textViewDay.setText("YOURTEXT"); linearLayout.addView(textViewDay);
par conséquent,linearLayout.removeAllViews();
serait nécessaire de sorte que vous ne finissent pas l'ajout de plus de TextViews sur chaque appel àgetView(...)
, qui est appelée à chaque fois que vous faites défiler vers le haut ou vers le basCes est mon code pour GirdView avec le Bouton + Textview
Changement ici et essayer de nouveau,
Envoyer et gridview ou listview et Dans le constructeur de mettre en œuvre cette méthode
mettre en œuvre onscroll auditeur
À l'aide de
ViewHolder
statique de la classe de répétition fixe les éléments pour moi.Aussi l'évolution des
layout_width
etlayout_height
àfill_parent
n'a pas aidé.Je suis allé à travers ce tutoriel
http://android-vogue.blogspot.com/2011/06/custom-gridview-in-android-with.html