Question

enter image description here

I want to implement this type of list-view. Problem is when i scroll the list, view got refreshed. The task is to show groups expanded up to 3 child's by default and when click on '+'(plus) button, child-items of that group will be expanded and new button will be shown below that group for collapsing that group to default layout means 3 child-items to show with plus('+') button. Plus button is shown when any group have child-items more than 3, if child-items are less than 3 or equal to 3 then all child-items will be shown with no plus button, but if child-items are more than 3 then plus button will be shown. Here 'DIAPERS' and 'LAUNDRY DETERGENT' are the group names.

Present scenario:- If child-position > 3, then set text-view visibility to 'GONE' and button visibility to 'VISIBLE'. But problem is that if childitems are more than 4 and i click to plus button to expand group , then only 4 child-items are shown 5 or next childitems are not shown.

If you want the code of this, please ask in the comments, I will provide you the code.

Was it helpful?

Solution

First of all you have need to set a minimum limit to the child view of expandable list view. Like 2 or 3 child for the very first time will get downloaded or fetched from your database or webservices. Then on that limit variable you can restrict expandable list view to display only first 2 and 3 child item.

Then with the child limit variable you have also needed a flag variable which contain information like "value 1 if list have more than 3 child's and 0 if list have 3 or less than three child's."

On the value of flag variable you can set plus button hidden and visible value in android.

For plus button click i think the below given code will help. on click just make a another call to the database and fetch all the child items and display them and refresh the expandable list view.

public class ProductListingExpandableAdapter extends BaseExpandableListAdapter {
    public String TAG = ProductListingExpandableAdapter.class.getSimpleName();
    private Context _context;int clickedPosition;
    private List<String> _listDataHeader; // header titles  child data in format of header title, child title
    private HashMap<String, ArrayList<String>> _listDataChild;
    ArrayList<String> CategoryId;
    String stateId,countryID;
    ArrayList<ProductDataBean> ProductList; ArrayList<ProductListingDisplayCheck> checkArrayList;

    int _ListSize;String user_id;
    ProductDataBean bean;
    /* Variable to do lazy loading of images */
    Handler handler;
    Runnable runnable;

    /* array list to hold data */
    ArrayList<String> BrandList;

         ImageLoader    imageLoader;
         private        DisplayImageOptions options;
         Activity a;    String RetailerImageUrl,BrandImageUrl;

    public ProductListingExpandableAdapter(Context context, List<String> listDataHeader, HashMap<String, ArrayList<String>> listChildData,
            int size,ArrayList<ProductDataBean> ProductList,ArrayList<ProductListingDisplayCheck> checkArrayList,ArrayList<String> CategoryId,  String user_id,String stateId,String countryID) 
    {
        this._context        =  context;
        this._listDataHeader =  listDataHeader;
        this._listDataChild  =  listChildData;                               
        this.CategoryId      =  CategoryId;    
        this.checkArrayList  =  checkArrayList;  
        this._ListSize       =  size;
        this.ProductList     =  ProductList;
        this.checkArrayList  =  checkArrayList;
        this.user_id         =  user_id;
        this.countryID       =  countryID;
        this.stateId         =  stateId;


         options = new DisplayImageOptions.Builder()

              .showImageForEmptyUrl(R.drawable.thumb_demo).cacheInMemory()
              .cacheOnDisc().build();
              imageLoader = ImageLoader.getInstance();            

        Log.d("....return the  the event image loader class...==", ""+imageLoader.getClass());
    }


    @Override
    public Object getChild(int groupPosition, int childPosititon) 
    {   
        //Log.i("Object getChild",String.valueOf(this._listDataChild.get(this._listDataHeader.get(groupPosition)).get(childPosititon)));    
        return this._listDataChild.get(this._listDataHeader.get(groupPosition)).get(childPosititon);        
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) 
    {   
        return childPosition;
    }

    @Override
    public View getChildView(final int groupPosition, final int childPosition,boolean isLastChild, View convertView, ViewGroup parent) 
    {               
        final String childText = (String) getChild(groupPosition, childPosition);

        if (convertView == null) 
        {           
            LayoutInflater infalInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.custom_brand_retailer_layout_new, null);                   
        }

        RelativeLayout ParentLayout=  (RelativeLayout) convertView.findViewById(R.id.parentLayout);         
        /* Retailer Image*/
        ImageView retailerImage    =  (ImageView) convertView.findViewById(R.id.retailerImage);     
        /* Brand Image */
        ImageView brandImage       =  (ImageView) convertView.findViewById(R.id.brandImage);        
        /* Product PricePerUnit */
        TextView pricePerUnit      =  (TextView) convertView.findViewById(R.id.pricePerItem);       
        /* Product PricePerUnit */
        TextView packetPrice       =  (TextView) convertView.findViewById(R.id.pricePerPacket);     
        /* Product Name */
        TextView productName       =  (TextView) convertView.findViewById(R.id.ProductName);
        /* Group close Images */ 
        RelativeLayout addMore     =  (RelativeLayout) convertView.findViewById(R.id.addMore);
        /* Minus Button Image */
        ImageView minusItems       =  (ImageView) convertView.findViewById(R.id.minusItems);        
        /* Minus Button Image */
        ImageView plusItems        =  (ImageView) convertView.findViewById(R.id.plusItems);     

     try   {
              JSONObject jObject = new JSONObject(childText);                        // Log.i("jObject",String.valueOf(jObject));

                pricePerUnit.setText ("$"+jObject.getString("pricePerItem"));
                packetPrice .setText ("$"+jObject.getString("product_price"));                  

                String itemNameString   =   "";
                String title            =   jObject.getString("product_name");

                if (title.length()  >  44) 
                {
                    itemNameString = title.substring(0, 45)+"...";
                } 
                else 
                {   itemNameString = title;                 
                }
                productName.setText(itemNameString);                

                RetailerImageUrl = jObject.getString("retailer_image_url_small");
                BrandImageUrl    = jObject.getString("brand_image_url");
                // String RetailerImageUrl = jObject.getString("pricePerItem");

            } catch (JSONException e) 
            {               
                e.printStackTrace();
            }

     //=========================================================================================

    // Log.e("Pagination ArrayList size", String.valueOf(Constants.PaginationPosition.size()));
    String PaginationPos               =         Constants.PaginationPosition.get(groupPosition);
    Log.e ("PaginationPos", String.valueOf(PaginationPos));
    // Log.e("is last child", String.valueOf(isLastChild));
      /*   Hide or Show Group Close option   */      

    Log.e("Pagination ArrayList size", String.valueOf(Constants.PaginationPosition.size()));

        if(PaginationPos.equals("1") && childPosition == 2 && isLastChild == true )
         {
             addMore.setVisibility(View.VISIBLE); minusItems.setVisibility(View.GONE ); plusItems.setVisibility(View.VISIBLE);
         }
         else if(PaginationPos.equals("0") && childPosition > 2 && isLastChild == true  )                                                   
         {
             addMore.setVisibility(View.GONE);          
         }
         else if(PaginationPos.equals("2") && childPosition > 2 && isLastChild == true  )                                             
         {
              plusItems.setVisibility(View.GONE);
              addMore.setVisibility  (View.VISIBLE);
              minusItems.setVisibility(View.VISIBLE);
              minusItems.setVisibility(View.VISIBLE);
              minusItems.setImageResource(R.drawable.minus);
         }
         else 
         {
            addMore.setVisibility(View.GONE);
         }
         //==================================================================================
        minusItems.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                Log.e("Constants.listDataHeader.get(groupPosition)", Constants.listDataHeader.get(groupPosition));
                String keyword = Constants.listDataHeader.get(groupPosition);
                    String alternate = ProductListingExpandableListViewActivity.demoJsonObjectTesting;
                    // check whether the list for keyword is present
                    ArrayList<String> alternateList = _listDataChild.get(keyword);
                    if(alternateList == null)  
                    {
                         Log.i(TAG, "list is null");
                        /* alternateList = new ArrayList<String>();
                          _listDataChild.put(keyword, alternateList);           */          
                    }
                    else
                    {

                        Constants.PaginationPosition.set(groupPosition, "1");
                        ArrayList<String> newList = new ArrayList<String>();
                        int size = alternateList.size();

                             Log.e("alternateList size", String.valueOf( alternateList.size()));
                                for(int i=0;i<3;i++)
                                {
                                    newList.add(alternateList.get(i));                                  
                                }

                                alternateList.clear();

                                for(int i=0;i<3;i++)
                                {
                                alternateList.add(newList.get(i));
                                }

                          Log.i("alternate list size",String.valueOf( alternateList.size()));

                        ProductListingExpandableAdapter.this.notifyDataSetChanged();
                        //ProductListingExpandableAdapter.this.notifyDataSetInvalidated();

                        /*Intent showSearchResult = new Intent(_context,ProductListingExpandableListViewActivity.class);
                        showSearchResult.putExtra("ShowSeachResult", "2");
                        _context.startActivity(showSearchResult);
                        ((Activity)_context).finish();

                           Apply our splash exit (fade out) and main entry (fade in) animation transitions. 
                        ((Activity)_context). overridePendingTransition(R.anim.mainfadein, R.anim.splashfadeout);*/

                    }

            }
        });


        addMore.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                Log.i("addMore images list clicked", "addMore image clicked");
                //Clicked postion of group
                clickedPosition = groupPosition;   

                String keyword = Constants.listDataHeader.get(groupPosition);
                Log.i("keyword", keyword);

                for( int ii = 0;ii<Constants.listDataHeader.size();ii ++)
                {

                    String currentKeyword = Constants.listDataHeader.get(ii);
                    if(currentKeyword.equals(keyword)==false)
                    {               

                       // check whether the list for keyword is present
                        ArrayList<String> alternateList = _listDataChild.get(currentKeyword);
                        if(alternateList == null)  
                        {
                             Log.i(TAG,Constants.listDataHeader.get(groupPosition)+ " List is null");
                             /*alternateList = new ArrayList<String>();
                              _listDataChild.put(keyword, alternateList);       */              
                        }
                        else
                        {   

                            if(alternateList.size()>2)
                            {
                             Constants.PaginationPosition.set(ii, "1");
                             Log.i(TAG,Constants.listDataHeader.get(groupPosition)+ "inside else");
                            ArrayList<String> newList = new ArrayList<String>();
                            int size = alternateList.size();

                                 Log.e("alternateList size", String.valueOf( alternateList.size()));
                                    for   (int i=0; i<3;i++)
                                    {
                                        newList.add(alternateList.get(i));                                  
                                    }                                   
                                       alternateList.clear();

                                    for  (int j=0; j<3; j++)
                                    {
                                       alternateList.add(newList.get(j));
                                    }
                                    Log.i("alternate list size",String.valueOf( alternateList.size()));                     
                        }}
                    }
                }

                /*  Calling json webservices  */
                new LoadProductData(_context,groupPosition).execute();

            }
        });



        /*   Lazy loading class method  for loading Retailer images  */
             imageLoader.init(ImageLoaderConfiguration.createDefault(_context));

             if(RetailerImageUrl.equals("no image"))
             {
                 retailerImage.setBackgroundResource(R.drawable.no_img);
             }
             else
             {
                 imageLoader.displayImage(RetailerImageUrl,retailerImage,
                        options, new ImageLoadingListener() {
                            @Override
                            public void onLoadingComplete() {}

                            @Override
                            public void onLoadingFailed() {}

                            @Override
                            public void onLoadingStarted() {}
                        });

             }

                int SDK_INT = android.os.Build.VERSION.SDK_INT;

                 if (SDK_INT>=16)
                 {
                     if(BrandImageUrl.equals("no image")==false)
                     {
                         Drawable Branddrawable= Loadimage(BrandImageUrl);
                         brandImage.setBackground(Branddrawable);

                     }

                 }
                 else
                 {

                     if(BrandImageUrl.equals("no image")==false)
                     {
                         Drawable Branddrawable= Loadimage(BrandImageUrl);
                         brandImage.setBackgroundDrawable(Branddrawable);

                     }


            }
        return convertView;
    }

    @Override
    public int getChildrenCount(int groupPosition) 
    {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition)).size();
    }

    @Override
    public Object getGroup(int groupPosition) 
    {
        return this._listDataHeader.get(groupPosition);
    }

    @Override
    public int getGroupCount() 
    {
        return this._listDataHeader.size();
    }

    @Override
    public long getGroupId(int groupPosition) 
    {
        return groupPosition;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent) 
    {
        String headerTitle = (String) getGroup(groupPosition);

        if  (convertView == null)       {
            LayoutInflater infalInflater    =   (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView   = infalInflater.inflate (R.layout.list_group,  null);
        }

        TextView lblListHeader =     (TextView) convertView.findViewById(R.id.lblListHeader);
        lblListHeader.setTypeface    (null, Typeface.BOLD);
        lblListHeader.setText        (headerTitle);

            ExpandableListView mExpandableListView = (ExpandableListView) parent;
            mExpandableListView.expandGroup(groupPosition);

        return convertView;
    }

    @Override
    public boolean hasStableIds() 
    {
        return false;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

    // Background async  task
    /* State/Province list background thread */
    class LoadProductData extends AsyncTask<Void, Void, Void> {

        private ProgressDialog dialog;String response;
        Context context;int GroupPos;
        private JSONArray jsonarray, stateJsonArray;

        public LoadProductData(Context context,int GroupPos) {
            super();
            this.GroupPos   = GroupPos; 
            this.context = context;

        }

        @Override
        protected void onPreExecute()  {

            super.onPreExecute();
            dialog = ProgressDialog.show(context, "","Please wait...", true, true);dialog.show();
            Log.e("Adapter pre execute ", "in the pre-execute loop");

        }

        @Override
        protected Void doInBackground(Void... params) {

            try {

                //Constants.listDataChild.clear();Constants.listDataHeader.clear();Constants.productListing.clear();
                Log.e(TAG  , "in the background-execute loop");
                UserFunctions userFunctions = new UserFunctions();

                String CategoryID = String.valueOf(Constants.CategoryId.get(GroupPos));     Log.e("CategoryId"  , Constants.CategoryId.get(GroupPos));

                JSONObject CategoryJson = userFunctions.SingleCategoryListRequest(CategoryID,user_id,stateId,countryID); // Log.i("Product Lisiting Json Array",String.valueOf(CategoryJson));

                String result = CategoryJson.getString("result"); 
                Log.i("result",result);
                if(result.equals("no records found"))
                {
                    response = "no records found";
                }
                else
                {
                    response = "record found";

                // SearchResult refers to the current element in the array
                // "search_result"
                JSONObject questionMark = CategoryJson.getJSONObject("result");


                Iterator keys = questionMark.keys();
                ProductListingDisplayCheck addCheck; 

                int i = 0;
                while (keys.hasNext()) {

                    // Loop to get the dynamic key
                    String currentDynamicKey = (String) keys.next();    // Log.i("current Dynamic key",
                                                                        // String.valueOf(currentDynamicKey));
                    ArrayList<String>   BrandList = new ArrayList<String>();

                    // Get the value of the dynamic key
                    JSONObject currentDynamicValue = questionMark.getJSONObject(currentDynamicKey); // Log.i("current Dynamic Value"+String.valueOf(i),
                    String product_list = currentDynamicValue.getString("product_listing"); // Log.i("product_listing",String.valueOf(product_list));

                    addCheck = new ProductListingDisplayCheck();
                    addCheck.setCheckStatus(0);

                    checkArrayList . add(addCheck);
                    Log.i("checkArrayList size",String.valueOf(checkArrayList.size()));

                    JSONArray product_listing = currentDynamicValue.getJSONArray    ("product_listing");
                     BrandList = Constants.listDataChild.get(currentDynamicKey);    Log.i("BrandList size", String.valueOf(BrandList.size()));
                     BrandList.clear();

                    for (int ii = 0; ii < product_listing.length(); ii++)        
                    {
                        JSONObject jsonobject = product_listing.getJSONObject(ii);
                        String JsonObjectString = String.valueOf(jsonobject);
                        if ( BrandList == null )  
                        {
                            BrandList = new ArrayList<String>();
                            Constants.listDataChild.put(currentDynamicKey, BrandList);
                        }                       
                        BrandList.add(JsonObjectString);                        
                    }



                    //HashMap<String, ArrayList<String>> _listDataChild = null;

                     /* String keyword = "Wipes";
                        String alternate = ProductListingExpandableListViewActivity.demoJsonObjectTesting;
                        // check whether the list for keyword is present
                        ArrayList<String> alternateList = _listDataChild.get(keyword);
                        if(alternateList == null)  {
                             alternateList = new ArrayList<String>();
                            _listDataChild.put(keyword, alternateList);
                        }
                        alternateList.add(ProductListingExpandableListViewActivity.demoJsonObjectTesting);
                        */


                    Constants.PaginationPosition.set(GroupPos, "2");
                    Constants.listDataChild.put(Constants.listDataHeader.get(clickedPosition), BrandList);
                    Log.i("hash map size", String.valueOf(Constants.listDataChild.size()));



                    /* Update the value of position */
                    i++;

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

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            dialog.dismiss();

        if(response.equals("no records found")) 
        {
            Toast.makeText(_context, "No Record Found.", 500).show();
        }
        else
        {
            ProductListingExpandableAdapter.this.notifyDataSetChanged();
            /*Intent showSearchResult = new Intent(_context,ProductListingExpandableListViewActivity.class);
            showSearchResult.putExtra("ShowSeachResult", "2");
            _context.startActivity(showSearchResult);
            ((Activity)context).finish();

               Apply our splash exit (fade out) and main entry (fade in) animation transitions. 
            ((Activity)context). overridePendingTransition(R.anim.mainfadein, R.anim.splashfadeout);*/
        }
    }

        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }
    }


    private Drawable Loadimage(String url)
    {
      try
    {
        InputStream is = (InputStream) new URL(url).getContent();
        Drawable d = Drawable.createFromStream(is, "src name");
        return d;
    }   
       catch (Exception e) {
      // tv.setText("Exc="+e);
       return null;
    }
    }  


  }

OTHER TIPS

You can use the Expand List custom Class, the following might be helpful:

public void setListViewHeightBasedOnChildren(ListView listView) {
    ListAdapter listAdapter = listView.getAdapter();
    if (listAdapter == null) {
        return;
    }

    int totalHeight = listView.getPaddingTop() + listView.getPaddingBottom();
    for (int i = 0; i < listAdapter.getCount(); i++) {
        View listItem = listAdapter.getView(i, null, listView);
        if (listItem instanceof ViewGroup)
            listItem.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        listItem.measure(0, 0);
        totalHeight += listItem.getMeasuredHeight();
    }

    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    listView.setLayoutParams(params);
}

try this out.it worked for me.

i solved this problem by using this link https://github.com/PaoloRotolo/ExpandableHeightListView .

package com.rtt.reeferwatch.utilities;

import android.content.Context;
import android.util.AttributeSet;
import android.view.ViewGroup;
import android.widget.ExpandableListView;

public class ExpandableHeightListView extends ExpandableListView {

boolean expanded = false;

public ExpandableHeightListView(Context context) {
    super(context);
}

public ExpandableHeightListView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public ExpandableHeightListView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

public boolean isExpanded() {
    return expanded;
}


@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    if (isExpanded()) {
        int expandSpec = MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);

        ViewGroup.LayoutParams params = getLayoutParams();
        params.height = getMeasuredHeight();
    } else {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

public void setExpanded(boolean expanded) {
    this.expanded = expanded;
}
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top