GridView Darstellungsprobleme

  • 6 Antworten
  • Letztes Antwortdatum
C

chimhate

Neues Mitglied
0
Guten Tag Leute,

ich bin im Moment dabei eine GridView zu bauen. Ich zeige in dieser GridView Bilder aus einem Assets Verzeichnis an.

Leider sieht die GridView etwas "komisch" aus. Bilder wiederholen sich manchmal und beim scrollen verschieben sich die Zellen. Ich denke es liegt an meiner getView() Methode aber weiß nicht so recht wie ich das Problem beheben kann. Wahrscheinlich handelt es sich um den else zweig oder?

Hier mal der Code meiner ImageAdapter Klasse:

PHP:
public class ImageAdapter extends BaseAdapter {

        private Context context;
        private List<Player> player;
     
        public ImageAdapter(Context context, List<Player> player) {
            this.context = context;
            this.player = player;
        }
     
        public View getView(int position, View convertView, ViewGroup parent) {
                 
            LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     
            View gridView;
            if (convertView == null) {
                     
                gridView = new View(context);
     
                // get layout from mobile.xml
                gridView = inflater.inflate(R.layout.mobile, null);
     
                // set value into textview
                TextView textView = (TextView) gridView
                        .findViewById(R.id.grid_item_label);
                textView.setText(player.get(position).getFirstname() + " " + player.get(position).getLastname()); 
     
                // set image based on selected text
                ImageView imageView = (ImageView) gridView.findViewById(R.id.grid_item_image);
                                                     
                try {
                    imageView.setImageBitmap(getBitmapFromAsset(player.get(position).getImagePath()));
                } catch (IOException e) {
                    Log.i("Failed to get bitmap from assets", "blabla");
                } catch (Exception e) {
                    Log.i(position + "Something went wront" + e, "blabla");
                }
     
            } else {
                gridView = (View) convertView;
                            
            }
     
            return gridView;
        }
        
        public Bitmap getBitmapFromAsset(String strName) throws IOException
        {
            AssetManager assetManager = context.getAssets(); 
            
            InputStream istr = assetManager.open("images/" + strName);
            Bitmap bitmap = BitmapFactory.decodeStream(istr);
            istr.close();

            return bitmap;
        }
     
        @Override
        public int getCount() {
            return player.size();
        } 
     
        @Override
        public Object getItem(int position) {
            return null;
        }
     
        @Override
        public long getItemId(int position) {
            return 0;
        }
     
    }
 
hmm du musst das korrekte bild immer setzen.

im moment setzt du das bild nur dann, wenn converview = null ist. Wenn du nun scrollst, wird convertview nicht mehr null sein, weil es wiederverwendet wird, aber es enthält noch das bild von früher .
 
Prinzipiell gesehen in beiden zweigen das gleiche ausführen? Brauch man die Unterscheidung dann überhaupt? ;-)
 
Nicht ganz, da ist ein kleiner, aber feiner Unterschied.
Tipp: guck dir mal an, wo gridView seinen Wert herbekommt. :D
 
naja 2 mal das gleiche ausführen wäre etwas unnötig.

das was du da versucht hast würde sich ViewHolder Pattern nennen. Das ist wichtig für eine gute Performance. Aber zum Anfang kannst das einfachmal mal weglassen und schauen was passiert.

Dann liest bei Google mal nach, was es mit dem ViewHolder und dem convertView auf sich hat. Denke dann wird dir das etwas klarer werden.
 
Hallo, ich hab wie vorgeschlagen das Image in jedem Fall hinzugefügt. Es gibt keine doppelten Bilder mehr.

Aber trotzdem sieht meine GridVIew ein wenig "durcheinander" aus. Die Zeilenhöhe ist nicht wie von mir angegeben, Zellen verrutschen nach dem Scrollen bzw. wenn ich nach ganz unten und wieder hoch scrolle hab ich nachher eine weiße Seite.

PHP:
		public View getView(int position, View convertView, ViewGroup parent) {
				 
			LayoutInflater inflater = (LayoutInflater) context
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	 
			View gridView;
			if (convertView == null) {				 
				gridView = new View(context);
			} else {
				gridView = (View) convertView;			
			}
					 
			// get layout from mobile.xml
			gridView = inflater.inflate(R.layout.mobile, null);
			
			// set value into textview
			TextView textView = (TextView) gridView.findViewById(R.id.grid_item_label);
			textView.setText(player.get(position).getFirstname() + " " + player.get(position).getLastname()); 
	
			// set image based on selected text
			ImageView imageView = (ImageView) gridView.findViewById(R.id.grid_item_image);
												
			try {
				imageView.setImageBitmap(getBitmapFromAsset(player.get(position).getImagePath()));
			} catch (IOException e) {
				Log.i("Failed to get bitmap from assets", "blabla");
			} catch (Exception e) {
				Log.i(position + "Something went wrong" + e, "blabla");
			}
	 
			return gridView;
		}
 
Du baust den gridView ja immer noch jedes mal neu.
 
Zurück
Oben Unten