How to load an item only once using an Android GridView adapter
-
02-01-2020 - |
Domanda
I've got a custom GridView
adapter (but that is irrelevant as I've seen this behaviour with other adapters too, but it's never bugged me this much), which I set to the GridView
with a list of items.
My code in the function I call to create my UI in my Activity
:
gridviewAdapter = new MyGridViewAdapter(this, itemList);
gv.setAdapter(gridviewAdapter);
My getView
function in my adapter class:
public View getView(int position, View convertView, ViewGroup parent)
{
MyGridViewItemData itemData = itemList.get(position);
Log.d(TAG, "MyGridViewAdapter-> Load view for " + itemData.getCategoryTitle());
View v = new MyGridViewItemView(this.context, itemData );
v.setOnClickListener((View.OnClickListener) parent);
v.setOnLongClickListener((View.OnLongClickListener) parent);
v.setOnTouchListener ((View.OnTouchListener) parent);
return v;
}
From my logs I can see that the same item, in the list of items I give the adapter, is created multiple times; irregularly. I've seen the same item being created 18 times, and 48 times! This does not happen consecutively - the other items in the list are also created inbetween and also multiple times.
My logs:
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Fruit
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Fruit
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Fruit
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Fruit
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Fruit
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Fruit
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Fruit
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Fruit
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
MyGridViewAdapter-> Load view for Crops
Why is this? And how can I get the adapter to only create the item if it's not being displayed yet?
Soluzione
You can try:
View v;
if(convertView == null){
MyGridViewItemData itemData = itemList.get(position);
Log.d(TAG, "MyGridViewAdapter-> Load view for " + itemData.getCategoryTitle());
v = new MyGridViewItemView(this.context, itemData );
convertView.setTag(v);
} else{
v = (View) convertView.getTag();
}
...
Altri suggerimenti
You should use the Holder pattern in your case.
If Android determines that a row is not visible anymore, it allows the getView() of the adapter method to reuse the associated view via the convertView parameter.
The adapter can assign new data to the views contained in the view hierarchy of the convertView. This avoids inflating an XML file and creating new Java objects.
In case Android cannot reuse a row, the Android system passes null to the convertView parameter. Therefore the adapter implementation needs to check for this.
Refer to this tutorial for more details