android - 自定义 ExpandableListview,其中包含子项中的另一个展开按钮

标签 android listview expandablelistview android-custom-view

enter image description here

我想实现这种类型的 ListView 。问题是当我滚动列表时, View 得到刷新。任务是默认显示最多 3 个 child 的组,当单击“+”(加号)按钮时,该组的子项将展开,新按钮将显示在该组下方,用于将该组折叠为默认布局表示用加号('+')按钮显示 3 个子项目。当任何组的子项目超过 3 个时显示加号按钮,如果子项目小于 3 或等于 3,则所有子项目将显示没有加号按钮,但如果子项目大于 3,则将显示加号按钮。这里 'DIAPERS' 和 'LAUNDRY DETERGENT' 是组名。

当前场景:- 如果 child-position > 3,则将 TextView 可见性设置为“GONE”,将按钮可见性设置为“VISIBLE”。但问题是,如果子项超过 4 个并且我单击加号按钮展开组,则只会显示 4 个子项 5 或不显示下一个子项。

如果你想要这个代码,请在评论中询问,我会提供代码。

最佳答案

首先,您需要为可扩展 ListView 的 subview 设置一个最小限制。大约有 2 或 3 个 child 第一次从您的数据库或网络服务中下载或获取。 然后在该限制变量上,您可以将可扩展 ListView 限制为仅显示前 2 个和第 3 个子项。

然后对于子限制变量,您还需要一个标志变量,其中包含诸如“如果列表中有超过 3 个 child 则值为 1,如果列表中有 3 个或少于三个 child 则为 0”之类的信息。

在flag变量的值上你可以设置plus button在android中隐藏和可见的值。

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

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


  }

关于android - 自定义 ExpandableListview,其中包含子项中的另一个展开按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22803347/

相关文章:

android - Android 中具有动态选项卡内容的动态选项卡

Android ExpandableListView GroupIndicator重力

android - 当我点击 ListView 的一个项目时,我想关闭 AlertDialog

android - 可扩展的 ListView 按年/月对项目进行分组

android - 如何在可扩展的 ListView 组之间留出空白

java - 如何在 MainActivity 中找到最后一个 fragment

android - 如何控制形状的渐变?

java - 未知故障(在 android.os.Binder.execTransact(Binder.java :674)) Error while Installing APKs

java - 安卓开发 : "thread exiting with uncaught exception"

android - Listview - 如何从第 10 项平滑滚动到顶部?