【问题标题】:Dynamic ExpandableListView from JSON来自 JSON 的动态 ExpandableListView
【发布时间】:2012-08-15 12:19:13
【问题描述】:

我想从一个解析的 JSON 文件中填充一个ExpandableListView

目标是将第一个条目 (kontakt_titel) 作为组的标题,将所有其他条目作为子项...

JSON 文件如下所示:

{
"contact":[
  {
     "kontakt_titel":"Berlin",
     "adresse_strasse":"Hauptstrasse 1",
     "adresse_plzort":"4000 Berlin",
     "telefon":"123456789",
     "fax":"123456780",
     "email":"berlin@123.com",
     "website":"www.berlin.123.com"
  },
  {
     "kontakt_titel":"London",
     "adresse_strasse":"East Highway 1",
     "adresse_plzort":"London",
     "telefon":"123456789",
     "fax":"123456780",
     "email":"london@123.com",
     "website":"www.london.123.com"
  },
  {
     "kontakt_titel":"New York",
     "adresse_strasse":"Time Square 1",
     "adresse_plzort":"12345",
     "telefon":"123456789",
     "fax":"123456780",
     "email":"newyork@123.com",
     "website":"www.newyork.123.com"
  }
 ]
}

这是我想将这些元素解析为 ExpandableListView 的代码:

try {
        JSONArray jContact = json.getJSONArray("contact");
        for (int i = 0; i < jContact.length(); i++) {
            JSONObject c4 = jContact.getJSONObject(i);

            String contact_title = c4.getString("kontakt_titel");
            String adresse_strasse = c4.getString("adresse_strasse");
            String adresse_plzort = c4.getString("adresse_plzort");
            String telefon = c4.getString("telefon");
            String fax = c4.getString("fax");
            String email = c4.getString("email");
            String website = c4.getString("website");

            if (contact_title != null && !contact_title.equals("")) {
                contactTitles.add(contact_title);
            } else {
                contactTitles.add("");
            }
            if (adresse_strasse != null && !adresse_strasse.equals("")) {
                contactAddressStreet.add(adresse_strasse);
            } else {
                contactAddressStreet.add("");
            }
            if (adresse_plzort != null && !adresse_plzort.equals("")) {
                contactAddressPlzOrt.add(adresse_plzort);
            } else {
                contactAddressPlzOrt.add("");
            }
            if (telefon != null && !telefon.equals("")) {
                contactTelephone.add(telefon);
            } else {
                contactTelephone.add("");
            }
            if (fax != null && !fax.equals("")) {
                contactFax.add(fax);
            } else {
                contactFax.add("");
            }
            if (email != null && !email.equals("")) {
                contactEmail.add(email);
            } else {
                contactEmail.add("");
            }
            if (website != null && !website.equals("")) {
                contactWebsite.add(website);
            } else {
                contactWebsite.add("");
            }
        }
    } catch (JSONException e) {
        errorHappened = true;
    } catch (NullPointerException npe) {
        errorHappened = true;
    }

我认为这一切正常......但我认为这是我的错误......这是我的适配器的getChildView()方法,它扩展了BaseExpandableListAdapter

@Override
    public View getChildView(int groupPosition, int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent) {

        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) myContext
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.row_contact, null);
        }

        TextView tvPlayerName = (TextView) convertView
                .findViewById(R.id.tvPlayerName);

        switch (childPosition) {
            case 0:
                tvPlayerName
                        .setText(MainActivity.contactAddressStreet.get(childPosition));
                break;
            case 1:
                tvPlayerName
                        .setText(MainActivity.contactAddressPlzOrt.get(childPosition));
                break;
            case 2:
                tvPlayerName
                        .setText(MainActivity.contactTelephone.get(childPosition));
                break;
            case 3:
                tvPlayerName
                        .setText(MainActivity.contactFax.get(childPosition));
                break;
            case 4:
                tvPlayerName
                        .setText(MainActivity.contactEmail.get(childPosition));
                break;
            case 5:
                tvPlayerName
                        .setText(MainActivity.contactWebsite.get(childPosition));
                break;
            case 6:
                tvPlayerName
                        .setText(MainActivity.contactOpening.get(childPosition));
                break;
        }

        return convertView;
    }

问题是,所有组中的所有孩子总是采用相同的条目。它以所有孩子中的第一个条目(柏林)为第一,所有孩子中的第二个条目(东一号公路)的第二个条目为第二个,依此类推。

【问题讨论】:

    标签: android json dynamic expandablelistview


    【解决方案1】:

    问题是由您为ExpandableListView 构建数据的方式以及您尝试在getChildView() 方法中显示它的方式引起的。

    您在大小相等的列表中解析 JSON 数据,其中列表中的每个位置都是一个 JSON 对象的数据。在getChildView 方法中,您使用childPosition 从正确的列表中获取该孩子的数据。但是使用 childPosition 是错误的,因为您会看到当前的行为。

    第 1 组(柏林)

    • childPosition == 0(使用contactAddressStreet中的第一个位置获取数据("Hauptstrasse 1"))
    • childPosition == 1(使用contactAddressPlzOrt中的第二个位置获取数据("London")))

    第 2 组(伦敦)

    • childPosition == 0(使用contactAddressStreet中的第一个位置获取数据("Hauptstrasse 1"))
    • childPosition == 1(使用contactAddressPlzOrt中的第二个位置获取数据("London")))

    如您所见,您没有考虑请求此孩子的组,无论如何您都会获得相同的数据。

    要使其工作,请使用childPosition 使用正确的数据列表,并使用groupPosition 从列表中获取实际值:

    // ...
    case 0: // child 0
         tvPlayerName.setText(MainActivity.contactAddressStreet.get(groupPosition));
         break;
    // ...
    

    另一种方法是在更适合ExpandableListView 的数据结构中解析JSON 对象。

    【讨论】:

      猜你喜欢
      • 2012-01-12
      • 2018-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 2012-12-18
      • 1970-01-01
      • 2012-04-03
      相关资源
      最近更新 更多