I have a GridView in android which I fill it with data retrieved from a xml resource.
For example I have 15 items in the GridView which are placed in order. The overall height exceeds the Screen height so i have to scroll to see the rest of the items.
The problem is when I scroll back up, the order of the invisible rows have changed. It's a mysterious behavior as sometimes items swap rows with each other.
Here is my getView
method:
public class ImageAdapter extends BaseAdapter {
public ImageAdapter(Context c, NodeList cuu) {
cu = cuu;
}
public int getCount() {
Log.d("Node Count",cu.getLength()+"");
return cu.getLength();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
View myView = convertView;
if (convertView == null) {
Node nd = cu.item(position);
Log.d("nodes","Pos: "+(position)+" Name: "+nd.getNodeName()+" Title: "+nd.getAttributes().getNamedItem("title").getTextContent());
int catID = Integer.parseInt(nd.getAttributes().getNamedItem("id").getTextContent());
LayoutInflater li = getLayoutInflater();
myView = li.inflate(R.layout.grid_item, null);
ImageView imageView = (ImageView) myView.findViewById(R.id.grid_item_image);
myView.setLayoutParams(new GridView.LayoutParams(70, 100));
id.download(nd.getAttributes().getNamedItem("icon").getTextContent(),imageView);
TextView textView = (TextView) myView.findViewById(R.id.grid_item_text);
textView.setText(nd.getAttributes().getNamedItem("title").getTextContent());
myView.setTag((Object) catID);
}else{
//Log.d("nodes","Pos: "+(position));
}
return myView;
}
private NodeList cu = null;
}
Update: Well, it's rather odd. After some more debugging I noticed that in the GridView, the Adapter skips the 13th position, meaning it returns 1 instead of 13 and then moves on to 14!!! (I guess the 13 is bad luck!)
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if (convertView == null) {
view= inflate your xml
} else {
view=convertView;
}
// all remaining code like
// view.findViewById(R.id.btn).setText("MyButton");
// must be outside if-else
}
If that is all the code you have in the getView
method you're not implementing it right:
public View getView(int position, View convertView, ViewGroup parent) {
View myView = convertView;
if (myView == null) {
Node nd = cu.item(position);
int catID = Integer.parseInt(nd.getAttributes().getNamedItem("id")
.getTextContent());
LayoutInflater li = getLayoutInflater();
myView = li.inflate(R.layout.grid_item, null);
myView.setLayoutParams(new GridView.LayoutParams(70, 100));
myView.setTag((Object) catID);
}
Node nd = cu.item(position);
Log.d("nodes", "Pos: " + (position) + " Name: " + nd.getNodeName()
+ " Title: "
+ nd.getAttributes().getNamedItem("title").getTextContent());
ImageView imageView = (ImageView) myView
.findViewById(R.id.grid_item_image);
id.download(nd.getAttributes().getNamedItem("icon")
.getTextContent(), imageView);
TextView textView = (TextView) myView
.findViewById(R.id.grid_item_text);
textView.setText(nd.getAttributes().getNamedItem("title")
.getTextContent());
return myView;
}
I don't know if the code above works, yours is a bit strange. Anyway, I think the behavior you see its normal because all you do in your adapter is populating the first visible elements and then the adapter will be reusing the exact same elements when you scroll up and down because of the recycling. In the getView
you should:
convertView
is null
:
null
it's time to inflate a new View
for this GridView
's element. You could also use the holder pattern to cache looking for the composing Views
(instead of searching with findViewById
everytime)(You use the setTag
element for the inflated View but it's a piece of data from the Node
data element ?!? What do you plan to do with it?!?)null
you'll do nothing(or if you implement the holder pattern you would get the tag with the already searched Views
)And this is what you should do in that if/else statement
Views
with data(so they hold the apropriate data for that position).If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With