其他分享
首页 > 其他分享> > android-自定义ExpandableListview在子级中包含另一个扩展按钮

android-自定义ExpandableListview在子级中包含另一个扩展按钮

作者:互联网

我想实现这种类型的列表视图.问题是当我滚动列表时,视图已刷新.任务是显示默认情况下最多可扩展到3个子组的组,当单击”(加号)按钮时,该组的子项将被扩展,新按钮将显示在该组下,以将该组折叠为默认布局.使用plus(”)按钮显示的3个子项目.当任何组的子项大于3时,将显示加号按钮,如果子项小于3或等于3,则所有子项将不带加号按钮显示,但如果子项大于3,则显示加号按钮将显示.这里的“ DIAPERS”和“ LAUNDRY DETERGENT”是组名.

当前方案:-如果子位置> 3,然后将文本视图的可见性设置为“ GONE”,将按钮的可见性设置为“ VISIBLE”.但是问题在于,如果子项大于4,并且我单击加号按钮以展开group,则仅显示4个子项5或不显示下一个子项.

如果您需要此代码,请在评论中提出,我将为您提供代码.

解决方法:

首先,您需要为可扩展列表视图的子视图设置一个最小限制.像2或3个孩子一样,第一次会从您的数据库或Web服务中下载或获取.
然后,在该限制变量上,您可以将可扩展列表视图限制为仅显示前2和3个子项.

然后,使用子限制变量,您还需要一个标志变量,其中包含以下信息:“如果列表包含3个以上的孩子,则值为1;如果列表包含3个或少于3个孩子,则值为0”.

在flag变量的值上,您可以在Android中设置加号按钮的隐藏值和可见值.

对于加号按钮,我认为下面给出的代码会有所帮助.单击后,只需再次调用数据库并获取所有子项并显示它们,然后刷新可扩展列表视图即可.

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 onl oadingComplete() {}

                            @Override
                            public void onl oadingFailed() {}

                            @Override
                            public void onl oadingStarted() {}
                        });

             }

                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;
    }
    }  


  }

标签:listview,expandablelistview,android-custom-view,android
来源: https://codeday.me/bug/20191121/2055367.html