2014-04-02 40 views
3

enter image description here定製ExpandableListview包含另一個擴展按鈕,在孩子

我想要實現這種類型的列表視圖中。問題是當我滾動列表,視圖被刷新。其任務是顯示最多默認擴展3個孩子的組,並且點擊'+'(加號)按鈕時,該組的子項將被展開,並且新按鈕將顯示在該組下方,以將該組摺疊爲默認佈局意味着3個帶有加號('+')按鈕的子項目。如果任何一組的兒童項目超過3個,如果兒童項目少於3或等於3,則所有兒童項目都將顯示爲不帶加號按鈕,但如果子項目超過3,則顯示加號按鈕。加號按鈕將會顯示。這裏的'DIAPERS'和'LAUNDRY DETERGENT'是組名。

目前場景: - 如果孩子位置> 3,則將文本視圖可見性設置爲'GONE'並將按鈕可見性設置爲'VISIBLE'。但問題是,如果子項超過4,並且我點擊加號按鈕展開組,則僅顯示4個子項目,否則不顯示5個或下一個子項目。

如果你想要這個代碼,請在評論中提問,我會爲你提供代碼。

+0

嗨比馬爾,我陷在類似problem.Can請您指導我一些演示code.It將是me.Thanks〜 – BiswajitP

+0

嗨很偉大,我做了定製的,根據我的需要提供如下代碼。你也可以使用下面的代碼。 –

回答

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


    } 
1

可以使用展開列表自定義類,下面可能會有所幫助:

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); 
} 
+0

我想在適配器中執行自定義列表,而不是在活動中,並且在點擊加號按鈕時出現問題,所有的子項目都不顯示。所以必需的代碼是適配器,以便顯示子項。沒有列表視圖高度或添加項目的問題。 –

+0

您需要將您的孩子的整個佈局帶入getChildView()方法,並在那裏膨脹佈局並單獨綁定控件。 –

1

試試這個out.it爲我工作。

我使用此鏈接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; 
} 
} 
相關問題