Android gridview : error while displaying large number of images -
i have grid view populated using custom imageadapter class extending baseadapter. images dynamically loaded particular folder in sd card. have named images according postition (1.png, 2.png etc.). have set onclicklistener
grid items: audio file same name image played sd card.
it works when number of images less , fits on screen.
but when number large , images doesn't fit on screen, next set of rows displayed scrolling screen downwards repetition of images first few rows rather images @ corresponding position.
i find logcat getview()
function of adapter class gets called images visible on screen , while scrolling downwards, not being called further positions
also entire set of images gets re-arranged. should different basic implementation of grid view displaying large number of images? there else must taking care of?
edit - code
i'm setting each tab using
tabgrid[i].setadapter(new imageadapter(this,i));
this image adapter class
@override public int getcount() { // filenames string array containing image file names : 1.png, 2.png etc return filenames.length; } @override public object getitem(int position) { return null; } @override public long getitemid(int position) { // did not use function return 0; } @override public view getview(int position, view convertview, viewgroup parent) { // todo auto-generated method stub view v; if(convertview==null) { layoutinflater inflater = (layoutinflater)mcontext.getsystemservice(context.layout_inflater_service); v = inflater.inflate(r.layout.grid_image, null); imageview iv = (imageview)v.findviewbyid(r.id.icon_image); string bitmapfilename = filenames[position]; bitmap bmp =(bitmap)bitmapfactory.decodefile(dir.getpath() + "/" + bitmapfilename);a iv.setimagebitmap(bmp); } else { v = convertview; } return v; }
does getitem()
, getitemid()
functions matter? directories , file names valid.
here's quick fix should better.
@override public string getitem(int position) { return filenames[position]; } @override public long getitemid(int position) { return position; } @override public view getview(int position, view convertview, viewgroup parent) { view v; if(convertview==null) { layoutinflater inflater = (layoutinflater)mcontext.getsystemservice(context.layout_inflater_service); v = inflater.inflate(r.layout.grid_image, parent, false); } else { v = convertview; } imageview iv = (imageview)v.findviewbyid(r.id.icon_image); string bitmapfilename = getitem(position); bitmap bmp =(bitmap)bitmapfactory.decodefile(dir.getpath() + "/" + bitmapfilename);a iv.setimagebitmap(bmp); return v; }
- i filled getitem, it's not 100% needed it's better have it. rest of adapter code can rely on it
- the item id should different every entry, either use getitem(position).hashcode() (might slower) or return position (which did here).
- the getview method bit more tricky. idea if convertview null, create it. , then, in every case, set view's content.
- the inflate in getview item should use parent parent, , "false" there tell system not add new view parent (the gridview take care of that). if don't, layout parameters might ignored.
the erorr had because views getting recycled (convertview not null) , weren't setting content those. hope helps !
Comments
Post a Comment