0

ExpandableListView解析された JSON ファイルから入力したいと思います。

目標は、最初のエントリ (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;
    }

問題は、すべてのグループのすべての子に対して常に同じエントリを取得することです。すべての子の最初のエントリ (Berlin) を最初とし、すべての子の 2 番目のエントリ (East Highway 1) を 2 番目とします。

4

1 に答える 1

1

この問題は、のデータを作成した方法と、メソッドでデータExpandableListViewを表示しようとした方法が原因で発生しますgetChildView()

JSONそのデータを同じサイズのリストで解析します。リスト内の各位置は、1つのJSONオブジェクトのデータの一部です。このgetChildViewメソッドでは、を使用しchildPositionて、右側のリストからその子のデータを取得します。しかしchildPosition、現在の動作がわかるように、を使用するのは間違っています。

グループ1(ベルリン)

  • childPosition == 0(からの最初の位置を使用しcontactAddressStreetてdata("Hauptstrasse 1")を取得します)
  • childPosition == 1(から2番目の位置を使用しcontactAddressPlzOrtてデータを取得します("London")))

グループ2(ロンドン)

  • childPosition == 0(からの最初の位置を使用しcontactAddressStreetてdata("Hauptstrasse 1")を取得します)
  • childPosition == 1(から2番目の位置を使用しcontactAddressPlzOrtてデータを取得します("London")))

ご覧のとおり、この子が要求されているグループを考慮せず、何があっても同じデータを取得します。

これを機能させるには、childPositionを使用して正しいデータリストを使用し、を使用groupPositionしてリストから実際の値を取得します。

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

もう1つの方法は、にJSON適したデータ構造内のオブジェクトを解析することExpandableListViewです。

于 2012-08-15T15:32:40.680 に答える