2

In my app I have a GridView inside ViewPager.

I am not using anywhere match_parent or wrap_content. I am using values like 200dp or 150dp. So why is my getView() of GridView adapter is calling multiple times?

I searched a lot like here, here, here, and here.

This is my adapter class.

public class CustomGridViewAdapter1 extends BaseAdapter {
    ArrayList<Integer> list2 = new ArrayList<Integer>();
    private LayoutInflater mInflater;

    public CustomGridViewAdapter1(Context context, ArrayList<Integer> list2) {
        mInflater = LayoutInflater
                .from(context.getApplicationContext());
        this.list2 = list2;
    }

    @Override
    public int getCount() {
        return 6;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        try {
            View hView = convertView;
            if (convertView == null) {
                hView = mInflater.inflate(R.layout.greeditem, null);
                ViewHolder1 holder = new ViewHolder1();
                holder.song_pic = (ImageView) hView.findViewById(R.id.pic1);
                holder.name = (TextView) hView
                        .findViewById(R.id.tabletext1);
                holder.layout = (LinearLayout) hView
                        .findViewById(R.id.bingo_rlayout1);
                hView.setTag(holder);
            }

            ViewHolder1 holder = (ViewHolder1) hView.getTag();
            imageLoader.DisplayImage(list1.get(position), holder.song_pic);
            holder.name.setText(list.get(position));
            if (list2.get(position) == 1) {
                holder.layout.setBackgroundColor(getActivity()
                        .getResources().getColor(R.color.lightblue));
                holder.name.setTextColor(getActivity().getResources().getColor(R.color.white));
            }

            return hView;
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

And this is my XML layout:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <GridView
        android:id="@+id/gridView1"
        android:layout_width="320dp"
        android:layout_height="250dp"
        android:layout_below="@+id/ticketText"
        android:numColumns="2" 
        android:background="#fff"
        android:listSelector="@android:color/white">

    </GridView>

     <TextView
        android:id="@+id/scoreId"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/ticketText"
        android:layout_alignBottom="@+id/ticketText"
        android:layout_alignParentRight="true"
        android:layout_marginRight="32dp"
        android:text="Score 1/6"
        android:textColor="#000000"
        android:textSize="16sp" />

    <TextView
        android:id="@+id/ticketText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/tablayout"
        android:layout_marginLeft="16dp"
        android:text="My Ticket #1"
        android:textColor="#000000"
        android:textSize="16sp" />

</RelativeLayout>
Community
  • 1
  • 1
Ekanta Swain
  • 473
  • 2
  • 13
  • 28

1 Answers1

2

We need to check the null condition in getView(). Try with below code:

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolderItem viewHolder;

    /*
     * The convertView argument is essentially a "ScrapView" as described is Lucas post 
     * http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/
     * It will have a non-null value when ListView is asking you recycle the row layout. 
     * So, when convertView is not null, you should simply update its contents instead of inflating a new row layout.
     */
    if(convertView==null){

        // inflate the layout
        LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
        convertView = inflater.inflate(layoutResourceId, parent, false);

        // well set up the ViewHolder
        viewHolder = new ViewHolderItem();
        viewHolder.textViewItem = (TextView) convertView.findViewById(R.id.textViewItem);

        // store the holder with the view.
        convertView.setTag(viewHolder);

    }else{
        // we've just avoided calling findViewById() on resource everytime
        // just use the viewHolder
        viewHolder = (ViewHolderItem) convertView.getTag();
    }

    // object item based on the position
    ObjectItem objectItem = data[position];

    // assign values if the object is not null
    if(objectItem != null) {
        // get the TextView from the ViewHolder and then set the text (item name) and tag (item ID) values
        viewHolder.textViewItem.setText(objectItem.itemName);
        viewHolder.textViewItem.setTag(objectItem.itemId);
    }

    return convertView;

}
Sufian
  • 6,405
  • 16
  • 66
  • 120
Pinki
  • 21,723
  • 16
  • 55
  • 88
  • 1
    I think there may be some other problem.I used ur code but got the same result.Can u tell me why it happens.wt is the reason that getview is calling infinite times. – Ekanta Swain Nov 13 '13 at 11:06