2017-02-14 4 views
-1

Ich habe eine CustomGrid für einen Produktkatalog. Die Daten für das Grid sind lokal gespeichert. Der Text stammt aus einer lokalen JSON-Datei und die Bilder werden auch unter res gespeichert.Android - Gridview verhält sich verrückt

Während die GridView angezeigt wird, sind die 300 Elemente nicht richtig angeordnet. Sie wiederholen sich nach 20 Einträgen und sie mischen sich, wenn ich nach oben und unten scrolle.

Ich debuggte die Datenfelder, aber sie sehen gut aus. Ich habe jetzt auch den gleichen Bildpfad für jeden Gegenstand. So hat jedes Gridview-Objekt das gleiche Bild. Aber das ist kein unterschiedliches Verhalten der GridView.

Ich habe keine Probleme auf anderen Gridviews mit viel weniger Elemente. Ich lese über Lazy Loading, aber ich lade die Bilddateien nicht

Warum verhält sich das Grid so? Ist das zu viel Überlastung auf einmal? Wie kann ich dieses Problem lösen?

EDIT:

CustomGrid:

public class CustomGrid extends BaseAdapter{ 
private Context mContext; 
private final String[] gridItemText; 
private final int[] imageID; 

public CustomGrid(Context c, String[] gridItemText, int[] imageID){ 
    mContext = c; 
    this.gridItemText = gridItemText; 
    this.imageID = imageID; 
} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return gridItemText.length; 
} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    View grid; 
    LayoutInflater inflater = (LayoutInflater) mContext 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    if (convertView == null) { 

     //grid = new View(mContext); 
     grid = inflater.inflate(R.layout.grid_single_main, null); 
     TextView textView = (TextView) grid.findViewById(R.id.grid_single_text); 
     ImageView imageView = (ImageView)grid.findViewById(R.id.grid_single_image); 
     textView.setText(gridItemText[position]); 
     imageView.setImageResource(imageID[position]); 
    } else { 
     grid = (View) convertView; 
    } 

    return grid; 
} 

} 

Aktivität:

CustomGrid adapter = new CustomGrid(ProductCatalogActivity.this, menuData, imagePath); 
    gridView1=(GridView)findViewById(R.id.grid_Main); 
    gridView1.setAdapter(adapter); 
    gridView1.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { 
      //ToDo 
    } 
}); 
+3

Können Sie bitte einen Code hinzufügen – raktale

+0

Ich habe den entsprechenden Code hinzugefügt – Mike

Antwort

1

Versuchen Sie dies in einem Ort Ihrer Viewholder Mechanismus

TextView textView; 
    ImageView imageView; 

    if (convertView == null) { 

     //grid = new View(mContext); 
     convertView = inflater.inflate(R.layout.grid_single_main, null); 
     textView = (TextView) convertView.findViewById(R.id.grid_single_text); 
     imageView = (ImageView) convertView.findViewById(R.id.grid_single_image); 
     convertView.setTag(new ViewHolder(textView, imageView)); 
    } else { 

     ViewHolder viewHolder = (ViewHolder) convertView.getTag(); 
     textView = viewHolder.textView; 
     imageView = viewHolder.imageView; 

    } 

    textView.setText(gridItemText[position]); 
    imageView.setImageResource(imageID[position]); 
return convertView; 

auch diese viewholder verwenden

private static class ViewHolder { 

     public final TextView textView; 
     public final ImageView imageView; 

     public ViewHolder(TextView textView, ImageView imageView) { 
      this.textView = textView; 
      this.imageView = imageView; 
     } 
    } 
+0

Danke. Das hat funktioniert. Aber warum? – Mike

+0

Nun meine Vermutung ist, dass der Ansichtshalter, den Sie verwendet haben, die Objekte nicht richtig gehandhabt hat. Zum Beispiel gab es keinen Objektreferenzhaltemechanismus wie setTag() oder Äquivalent, so dass sich der Status der Objekte ändern könnte. – raktale