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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top