2012-08-15 136 views
0

我想从解析的JSON文件填充ExpandableListView来自JSON的动态ExpandableListView

的目标是把第一个条目(kontakt_titel)作为该组的标题和所有其它的儿童...

JSON文件看起来是这样的:

{ 
"contact":[ 
    { 
    "kontakt_titel":"Berlin", 
    "adresse_strasse":"Hauptstrasse 1", 
    "adresse_plzort":"4000 Berlin", 
    "telefon":"123456789", 
    "fax":"123456780", 
    "email":"[email protected]", 
    "website":"www.berlin.123.com" 
    }, 
    { 
    "kontakt_titel":"London", 
    "adresse_strasse":"East Highway 1", 
    "adresse_plzort":"London", 
    "telefon":"123456789", 
    "fax":"123456780", 
    "email":"[email protected]", 
    "website":"www.london.123.com" 
    }, 
    { 
    "kontakt_titel":"New York", 
    "adresse_strasse":"Time Square 1", 
    "adresse_plzort":"12345", 
    "telefon":"123456789", 
    "fax":"123456780", 
    "email":"[email protected]", 
    "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; 
    } 

我想这是所有工作...但我觉得这里是我的错误的地方......这是我的适配器方法延伸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; 
    } 

的问题是,它始终以同一个项目的所有组中的所有儿童。它需要所有孩子的第一个入口(柏林)作为第一,第二个(东1号高速公路)的第二入口作为第二个等所有孩子。

回答

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; 
// ... 

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

+0

非常感谢!很好,自我解释的答案... – user754730 2012-08-16 06:48:34