title: Expandable ListView call getGroupCount() method again and again
body: <p>I have used <code>BaseExpandableListAdapter</code> for my expandable List View. It calls <code>getGroupCount()</code> again and again which decreases application performance.
  Here is my code:</p>
  
  <pre><code>public class ExpandableCustomAdapter extends BaseExpandableListAdapter {
  
      private LayoutInflater inflater;
      ArrayList&lt;MenuItem&gt; menuItem;
      Context context;
      private Map&lt;String, ArrayList&lt;MenuItem&gt;&gt; parent;
  
      public ExpandableCustomAdapter(Context context, Map&lt;String, ArrayList&lt;MenuItem&gt;&gt; mParent) {
          parent = mParent;
          inflater = LayoutInflater.from(context);
          this.context = context;
      }
  
      @Override
      // counts the number of group/parent items so the list knows how many
      // times calls getGroupView() method
      public int getGroupCount() {
          int size = parent.size();
  
          return size;
      }
  
      @Override
      // counts the number of children items so the list knows how many times
      // calls getChildView() method
      public int getChildrenCount(int i) {
          List&lt;String&gt; copyOfKeys = new ArrayList&lt;String&gt;(parent.keySet());
          menuItem = parent.get(copyOfKeys.get(i));
  
          return menuItem.size();
      }
  
      @Override
      public Object getChild(int groupPosition, int childPosition) {
          List&lt;String&gt; copyOfKeys = new ArrayList&lt;String&gt;(parent.keySet());
          menuItem = parent.get(copyOfKeys.get(groupPosition));
          Object obj = menuItem.get(childPosition);
  
          return obj;
      }
  
      @Override
      // in this method you must set the text to see the parent/group on the
      // list
      public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) {
  
          ParentViewHolder holder;
          System.out.println("getview:" + i);
  
          if (view == null)
          {
              holder = new ParentViewHolder();
              LayoutInflater infalInflater = (LayoutInflater) instance.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
              view = infalInflater.inflate(
                      R.layout.bannerlayoutparentinflater, null);
              holder.backgroundRelative = (RelativeLayout) view
                      .findViewById(R.id.mainlayoutparent);
  
              view.setTag(holder);
          }
  
          else
          {
              holder = (ParentViewHolder) view.getTag();
          }
  
          // Beverages_Cocktails_banner
          List&lt;String&gt; copyOfKeys = new ArrayList&lt;String&gt;(parent.keySet());
          menuItem = parent.get(copyOfKeys.get(i));
          String course = menuItem.get(0).course;
          Drawable background = new BitmapDrawable(getResources(), ImageList
                  .getInstance().getImageBitmap(value);
          holder.backgroundRelative.setBackground(background);
  
          // set Image indicator
          holder.indicator = (ImageView) view.findViewById(R.id.imageView1);
  
          if (b)
          {
              holder.indicator.setRotation(180);
          }
  
          else
          {
              Bitmap menuIndBitmapicatorBitmap = ImageList.getInstance()
                      .getImageBitmap(ImageNames.SECTION_HEADER_ARROW_IMAGE);
              holder.indicator.setImageBitmap(menuIndBitmapicatorBitmap);
              holder.indicator.setRotation(360);
          }
  
          // return the entire view
          return view;
      }
  
      @Override
      // in this method you must set the text to see the children on the list
      public View getChildView(int i, int i1, boolean b, View view,
              ViewGroup viewGroup) {
  
          ChildViewHolder childHolder;
  
          if (view == null) {
              childHolder = new ChildViewHolder();
              inflater = LayoutInflater.from(context);
              LayoutInflater infalInflater = (LayoutInflater) instance.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
              view = infalInflater.inflate(
                      R.layout.bannerlayoutchildinflater, null);
              childHolder.backgroundRelativeChild = (RelativeLayout) view
                      .findViewById(R.id.mainlayoutchild);
  
              view.setTag(childHolder);
          }
  
          else
          {
              childHolder = (ChildViewHolder) view.getTag();
          }
  
          //childHolder.backgroundRelativeChild.removeAllViews();
  
          List&lt;String&gt; copyOfKeys = new ArrayList&lt;String&gt;(parent.keySet());
          menuItem = new ArrayList&lt;MenuItem&gt;();
          menuItem = parent.get(copyOfKeys.get(i));
  
          // removeAllViews();
  
          CategoryCourseMenuList menuList1 = new CategoryCourseMenuList(
                  instance, null, 0, menuItem);
          MenuItem menu=menuItem.get(i1);
          menuList1.addLayoutMenu(menu);
  
      //  menuList1.setCourseMenuList(menuItem);
  
          LayoutParams menuListParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
          menuListParams.topMargin = Utils.getPixelValue(2);
          menuListParams.bottomMargin = Utils.getPixelValue(2);
          childHolder.backgroundRelativeChild.addView(menuList1, menuListParams);
          Animation animation = AnimationUtils.loadAnimation(context, R.anim.list_animation);
  
          // view.startAnimation(animation);
          // animation = null;
  
          // return the entire view
          return view;
      }
  
      @Override
      public void registerDataSetObserver(DataSetObserver observer) {
  
          /* used to make the notifyDataSetChanged() method work */
          super.registerDataSetObserver(observer);
      }
  
      @Override
      public Object getGroup(int groupPosition) {
          Object obj = parent.get(groupPosition);
  
          return obj;
      }
  
      @Override
      public long getGroupId(int groupPosition) {
          return groupPosition;
      }
  
      @Override
      public long getChildId(int groupPosition, int childPosition) {
          return childPosition;
      }
  
      @Override
      public boolean hasStableIds() {
          return false;
      }
  
      @Override
      public boolean isChildSelectable(int groupPosition, int childPosition) {
          return true;
      }
  }
  </code></pre>
  
  <p>Any Idea?</p>