Expandable ListView call getGroupCount() method again and again

604 views Asked by At

I have used BaseExpandableListAdapter for my expandable List View. It calls getGroupCount() again and again which decreases application performance. Here is my code:

public class ExpandableCustomAdapter extends BaseExpandableListAdapter {

    private LayoutInflater inflater;
    ArrayList<MenuItem> menuItem;
    Context context;
    private Map<String, ArrayList<MenuItem>> parent;

    public ExpandableCustomAdapter(Context context, Map<String, ArrayList<MenuItem>> 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<String> copyOfKeys = new ArrayList<String>(parent.keySet());
        menuItem = parent.get(copyOfKeys.get(i));

        return menuItem.size();
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        List<String> copyOfKeys = new ArrayList<String>(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<String> copyOfKeys = new ArrayList<String>(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<String> copyOfKeys = new ArrayList<String>(parent.keySet());
        menuItem = new ArrayList<MenuItem>();
        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;
    }
}

Any Idea?

0

There are 0 answers