【问题标题】:How to make dynamic expandable listview?如何制作动态可扩展列表视图?
【发布时间】:2017-03-06 12:06:45
【问题描述】:

我正在制作一个动态可扩展列表视图,我想在其中显示其标题(父级)和父级内的其他值,这意味着子级。我能够从服务器获取价值,并希望在可扩展列表视图中显示该值。我可以在 Header 中设置 Names 但我无法在 child 中显示其他值,我该怎么做请帮助我。

我关注this tutorial

这是Activity中的代码

public class Pxe extends Activity {

    ExpandableListAdapter listAdapter;
    ExpandableListView expListView;
    List<String> listDataHeader;
    HashMap<String, List<String>> listDataChild;
    String myJSON,company_name,from_date,to_date,location,fire_id,guard_number;
    JSONArray peoples = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ex_main);

        // get the listview
        expListView = (ExpandableListView) findViewById(R.id.lvExp);

        // preparing list data
       // prepareListData();
        getProp();

    }




    public void getProp(){
        class GetDataJSON extends AsyncTask<String, Void, String> {
            public void onPreExecute() {
                // Pbar.setVisibility(View.VISIBLE);
            }
            @Override
            protected String doInBackground(String... params) {

                InputStream inputStream = null;
                String result = null;
                try {

                    URL url = new URL("http://xxxxxxxxx/app/guard/guard_history.php");
                    JSONObject postDataParams = new JSONObject();
                    Log.e("Value>>>>>", String.valueOf(postDataParams));
                    postDataParams.put("guard_id", "1");
                    Log.e("params", postDataParams.toString());

                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setReadTimeout(15000 /* milliseconds */);
                    conn.setConnectTimeout(15000 /* milliseconds */);
                    conn.setRequestMethod("POST");
                    conn.setDoInput(true);
                    conn.setDoOutput(true);
                    OutputStream os = conn.getOutputStream();
                    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
                    writer.write(getPostDataString(postDataParams));

                    writer.flush();
                    writer.close();
                    os.close();

                    int responseCode=conn.getResponseCode();

                    if (responseCode == HttpsURLConnection.HTTP_OK) {

                        BufferedReader in=new BufferedReader(new InputStreamReader(conn.getInputStream()));
                        StringBuilder sb = new StringBuilder("");
                        String line="";
                        while ((line = in.readLine()) != null)
                        {
                            sb.append(line).append("\n");
                        }
                        result = sb.toString();
                    }

                    assert inputStream != null;
                    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
                    StringBuilder sb = new StringBuilder();

                    String line = null;
                    while ((line = reader.readLine()) != null)
                    {
                        sb.append(line).append("\n");
                    }
                    result = sb.toString();
                } catch (Exception e) {
                    Log.i("tagconvertstr", "["+result+"]");
                    System.out.println(e);
                }
                finally {
                    try{if(inputStream != null)inputStream.close();}catch(Exception squish){}
                }
                return result;
            }

            @Override
            protected void onPostExecute(String result){

                myJSON = result;
                prepareListData();

            }
        }
        GetDataJSON g = new GetDataJSON();
        g.execute();
    }



    public String getPostDataString(JSONObject params) throws Exception {

        StringBuilder result = new StringBuilder();
        boolean first = true;

        Iterator<String> itr = params.keys();

        while(itr.hasNext()){

            String key= itr.next();
            Object value = params.get(key);

            if (first)
                first = false;
            else
                result.append("&");

            result.append(URLEncoder.encode(key, "UTF-8"));
            result.append("=");
            result.append(URLEncoder.encode(value.toString(), "UTF-8"));

        }
        return result.toString();
    }


    private void prepareListData() {
        listDataHeader = new ArrayList<String>();
        listDataChild = new HashMap<String, List<String>>();
        List<String> top250 = new ArrayList<String>();

        try {
            peoples = new JSONArray(myJSON);
            for(int i=0;i<peoples.length();i++){
                JSONObject c = peoples.getJSONObject(i);

                company_name = c.getString("firm_name");
                from_date = c.getString("joining_date");
                to_date = c.getString("to_date");
                location=c.getString("duty_location");

                listDataHeader.add(company_name);
              //  System.out.println(company_name+" - "+from_date+" - "+to_date+" - "+location);
                top250.add("From Date: "+from_date);
                top250.add("To Date: "+to_date);
                top250.add("Location: "+location);
                listDataChild.put(listDataHeader.get(i), top250);

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




        // Adding child data
        //listDataHeader.add("Top 250");
        //listDataHeader.add("Now Showing");
      //  listDataHeader.add("Coming Soon..");

        // Adding child data
/*        top250.add("The Shawshank Redemption");
        top250.add("The Godfather");
        top250.add("The Godfather: Part II");
        top250.add("Pulp Fiction");
        top250.add("The Good, the Bad and the Ugly");
        top250.add("The Dark Knight");
        top250.add("12 Angry Men");

        List<String> nowShowing = new ArrayList<String>();
        nowShowing.add("The Conjuring");
        nowShowing.add("Despicable Me 2");
        nowShowing.add("Turbo");
        nowShowing.add("Grown Ups 2");
        nowShowing.add("Red 2");
        nowShowing.add("The Wolverine");

        List<String> comingSoon = new ArrayList<String>();
        comingSoon.add("2 Guns");
        comingSoon.add("The Smurfs 2");
        comingSoon.add("The Spectacular Now");
        comingSoon.add("The Canyons");
        comingSoon.add("Europa Report");*/




        listAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild);

        // setting list adapter
        expListView.setAdapter(listAdapter);


    }
}  

和 ExpandableList 适配器

public class ExpandableListAdapter extends BaseExpandableListAdapter {

    private Context _context;
    private List<String> _listDataHeader; // header titles
    // child data in format of header title, child title
    private HashMap<String, List<String>> _listDataChild;

    public ExpandableListAdapter(Context context, List<String> listDataHeader,
                                 HashMap<String, List<String>> listChildData) {
        this._context = context;
        this._listDataHeader = listDataHeader;
        this._listDataChild = listChildData;
    }

    @Override
    public Object getChild(int groupPosition, int 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(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.list_item, null);
        }

        TextView txtListChild = (TextView) convertView
                .findViewById(R.id.lblListItem);

        txtListChild.setText(childText);
        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);

        return convertView;
    }

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

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

图片

【问题讨论】:

    标签: android json listview expandablelistview


    【解决方案1】:

    审核您的代码后, 改变你的 for 循环,如: for(int i=0;i

                company_name = c.getString("firm_name");
                from_date = c.getString("joining_date");
                to_date = c.getString("to_date");
                location=c.getString("duty_location");
    
                listDataHeader.add(company_name);
              //  System.out.println(company_name+" - "+from_date+" - "+to_date+" - "+location);
                top250.add("From Date: "+from_date);
                top250.add("To Date: "+to_date);
                top250.add("Location: "+location);
                listDataChild.put(listDataHeader.get(i), top250);
                 top250 = new ArrayList<String>();
    
            }
    

    【讨论】:

    • 请举个例子
    • 让我从你的问题中举一个例子
    • 但是您是否使用了调试器并且您的 chind 数据是否正在您的适配器上
    • 我想说我正在从服务器获取所有数据,我得到的问题是如何将这些值附加到父项中
    • 请看图,你会明白我想说的
    【解决方案2】:

    你的功能:

    prepareListData()
    

    搞得一团糟。

    List<String> top250 = new ArrayList<String>();
    

    不在循环中。然后你有无穷无尽的添加,添加,添加......而无需重新初始化列表。

    将这一行放在循环中,你就完成了:)

    【讨论】:

      【解决方案3】:

      您可以创建基于动态数据类的可扩展卡片视图。 只需使用 MAIN 或 EXTRA 注释其字段:

      public enum FieldGroup {
      MAIN,
      EXTRA;
      

      }

      公共类 ElectricityBillDto 扩展 BillDto 实现 Serializable{

      @CustomAnnotation(value = FieldGroup.MAIN, title = R.string.name)
      @SerializedName("customer_name")
      private String customerName;
      
      @CustomAnnotation(value = FieldGroup.MAIN,title = R.string.type)
      @SerializedName("company_name")
      private String companyName ;
      
      @CustomAnnotation(value = FieldGroup.EXTRA,title = R.string.bill_id)
      @SerializedName("bill_identifier")
      private String billIdentifier ;
      
      @CustomAnnotation(value = FieldGroup.MAIN,title = R.string.payment_id)
      @SerializedName("payment_identifier")
      private String paymentIdentifier;
      
      @CustomAnnotation(title = R.string.type)
      @SerializedName("company_code")
      private int companyCode ;
      
      @CustomAnnotation(title = R.string.phase)
      @SerializedName("phase")
      private String phase;
      
      @CustomAnnotation(title = R.string.voltage_type)
      @SerializedName("voltage_type")
      private String voltageType ;
      
      @CustomAnnotation(title = R.string.amper)
      @SerializedName("amper")
      private String amper;
      
      @CustomAnnotation(title = R.string.contract_demand)
      @SerializedName("contract_demand")
      private Double contractDemand ;
      
      @CustomAnnotation(title = R.string.tariff_type)
      @SerializedName("tariff_type")
      private String tariffType;
      
      @CustomAnnotation(title = R.string.customder_type)
      @SerializedName("customder_type")
      private String customerType ;
      
      @CustomAnnotation(value = FieldGroup.MAIN, title = R.string.family)
      @SerializedName("customer_family")
      private String customerFamily;
      
      @CustomAnnotation(title = R.string.tel_number)
      @SerializedName("tel_number")
      private String telNumber ;
      
      @CustomAnnotation(title = R.string.mobile_number)
      @SerializedName("mobile_number")
      private String mobileNumber;
      
      @CustomAnnotation(title = R.string.service_add)
      @SerializedName("service_add")
      private String serviceAdd ;
      
      @CustomAnnotation(title = R.string.service_post_code)
      @SerializedName("service_post_code")
      private String servicePostCode;
      
      @CustomAnnotation(value = FieldGroup.MAIN, title = R.string.total_bill_debt)
      @SerializedName("total_bill_debt")
      private String totalBillDebt ;
      
      @CustomAnnotation(value = FieldGroup.MAIN, title = R.string.payment_dead_line)
      @SerializedName("payment_dead_line_persian")
      private String paymentDeadLinePersian ;
      
      @CustomAnnotation(title = R.string.other_account_debt)
      @SerializedName("other_account_debt")
      private String otherAccountDebt;
      
      @CustomAnnotation(title = R.string.total_register_debt)
      @SerializedName("total_register_debt")
      private Double totalRegisterDebt;
      
      @CustomAnnotation(title = R.string.location_status)
      @SerializedName("location_status")
      private String locationStatus;
      
      @CustomAnnotation(value = FieldGroup.MAIN,title = R.string.meter_number)
      @SerializedName("serial_number")
      private String serialNumber; //todo-z check
      
      @CustomAnnotation(title = R.string.payment_dead_line)
      @SerializedName("payment_dead_line")
      private Date paymnetDeadLine;
      
      @CustomAnnotation(title = R.string.last_read_date)
      @SerializedName("last_read_date")
      private Date lastReadDate;
      
      @CustomAnnotation(title = R.string.license_expire_date)
      @SerializedName("license_expire_date")
      private Date licenseExpireDate;
      
      @CustomAnnotation(title = R.string.lastupdatetime)
      @SerializedName("lastupdatetime")
      private Date lastupdatetime;
      
      @CustomAnnotation(title = R.string.last_gross_amt)
      @SerializedName("last_gross_amt")
      private Double LastGrossAmt;
      
      @CustomAnnotation(title = R.string.last_sale_year)
      @SerializedName("last_sale_year")
      private Double LastSaleYear;
      
      @CustomAnnotation(title = R.string.last_sale_prd)
      @SerializedName("last_sale_prd")
      private Double LastSalePrd;
      
      @CustomAnnotation(title = R.string.ispaid)
      @SerializedName("ispaid")
      private Boolean isPaid;
      
      @CustomAnnotation(title = R.string.subscription_id)
      @SerializedName("subscription_id")
      private Long subscriptionId;
      
      @CustomAnnotation(title = R.string.file_serial_number)
      @SerializedName("file_serial_number")
      private Long fileSerialNumber;
      
      @CustomAnnotation(title = R.string.x_degree)
      @SerializedName("x_degree")
      private Double xDegree;
      
      @CustomAnnotation(title = R.string.y_degree)
      @SerializedName("y_degree")
      private Double yDegree;
      
      @CustomAnnotation(title = R.string.national_code)
      @SerializedName("national_code")
      private String nationalCode;
      
      public int getCompanyCode() {
          return companyCode;
      }
      
      public String getCompanyName() {
          return companyName;
      }
      
      public String getPhase() {
          return phase;
      }
      
      public String getVoltageType() {
          return voltageType;
      }
      
      public String getAmper() {
          return amper;
      }
      
      public Double getContractDemand() {
          return contractDemand;
      }
      
      public String getTariffType() {
          return tariffType;
      }
      
      public String getCustomerType() {
          return customerType;
      }
      
      public String getCustomerName() {
          return customerName;
      }
      
      public String getCustomerFamily() {
          return customerFamily;
      }
      
      public String getTelNumber() {
          return telNumber;
      }
      
      public String getMobileNumber() {
          return mobileNumber;
      }
      
      public String getServiceAdd() {
          return serviceAdd;
      }
      
      public String getServicePostCode() {
          return servicePostCode;
      }
      
      public String getTotalBillDebt() {
          return Global.separateAmount(totalBillDebt)+ " " + baseContext.getString(R.string.rial);
      }
      
      public String getOtherAccountDebt() {
          return otherAccountDebt;
      }
      
      public Double getTotalRegisterDebt() {
          return totalRegisterDebt;
      }
      
      public String getLocationStatus() {
          return locationStatus;
      }
      
      public String getSerialNumber() {
          return serialNumber;
      }
      
      public Date getPaymnetDeadLine() {
          return paymnetDeadLine;
      }
      
      public Date getLastReadDate() {
          return lastReadDate;
      }
      
      public Date getLicenseExpireDate() {
          return licenseExpireDate;
      }
      
      public Date getLastupdatetime() {
          return lastupdatetime;
      }
      
      public Double getLastGrossAmt() {
          return LastGrossAmt;
      }
      
      public Double getLastSaleYear() {
          return LastSaleYear;
      }
      
      public Double getLastSalePrd() {
          return LastSalePrd;
      }
      
      public Boolean getPaid() {
          return isPaid;
      }
      
      public Long getSubscriptionId() {
          return subscriptionId;
      }
      
      public Long getFileSerialNumber() {
          return fileSerialNumber;
      }
      
      public Double getxDegree() {
          return xDegree;
      }
      
      public Double getyDegree() {
          return yDegree;
      }
      
      public String getNationalCode() {
          return nationalCode;
      }
      
      public String getPaymentDeadLinePersian() {
          return paymentDeadLinePersian;
      }
      
      public String getBillIdentifier() {
          return billIdentifier;
      }
      
      public String getPaymentIdentifier() {
          return paymentIdentifier;
      }
      

      }

          private void initView(Object object, CardView cardView, LinearLayout lytMain, LinearLayout lytExpandable, Button btnArrowDown) {
          int mainChildIndex = 2;
          int expandableChildIndex = 0;
      
          // Class
          for (Field field : object.getClass().getDeclaredFields()) {
              field.setAccessible(true);
      
              String value = null;
      
              try {
                  String methodName = "get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1);
      
                  Method m = object.getClass().getDeclaredMethod(methodName, null);
                  Object obj = m.invoke(object);
      
                  value = obj.toString();
      
                  if (value != null && field.getAnnotation(CustomAnnotation.class)!=null) {
      
                      KeyValueView kvView = new KeyValueView(cardView.getContext());
                      ViewGroup.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                              ViewGroup.LayoutParams.WRAP_CONTENT);
                      kvView.setLayoutParams(layoutParams);
      
                      kvView.setKey(getString(field.getAnnotation(CustomAnnotation.class).title()));
                      kvView.setValue(value);
      
                      if (field.getAnnotation(CustomAnnotation.class).value().equals(FieldGroup.MAIN)) {
                          lytMain.addView(kvView, mainChildIndex++);
                      }
                      if (field.getAnnotation(CustomAnnotation.class).value().equals(FieldGroup.EXTRA)) {
                          lytExpandable.addView(kvView, expandableChildIndex++);
                      }
                  }
              } catch (Exception e) {
              }
          }
          btnArrowDown.setVisibility(lytExpandable.getChildCount() > 1 ? VISIBLE : GONE);
      }
      

      【讨论】:

        猜你喜欢
        • 2019-09-23
        • 2016-11-09
        • 1970-01-01
        • 2017-02-16
        • 1970-01-01
        • 2017-09-02
        • 1970-01-01
        • 1970-01-01
        • 2014-02-24
        相关资源
        最近更新 更多