2012-04-07 22 views
7

我正在研究Android中的客戶端服務器項目。我需要解析來自給定URL的JSON並將其放置在ExpandableListView中。在JSON響應中,我正在獲取包含數組的節點的數據。所以,我必須將主JsonArray放置在ExpandableListView的組中。它工作正常。如何從android中的json動態創建可展開列表視圖中的組和子組件?

我可以找出有多少組來自JSON,但是當我試圖根據來自服務器的數據將子組放入每個組時,問題就出現了。我的代碼只將第一個孩子放在第一組中,但是當我點擊第二個孩子時,它顯示錯誤。

我需要將「ID」和「username」放入相應的組(例如:電子郵件,傳真,上傳)中。我的代碼可以在一個組中放置一個孩子信息,但是當我點擊第二組時,它會崩潰。任何形式的幫助將不勝感激。

所以,我的查詢是,我如何動態創建組,並根據服務器數據在每個子內部放置子數據?

以下是錯誤日誌:

04-07 17:49:02.194: E/AndroidRuntime(13285): FATAL EXCEPTION: main 
04-07 17:49:02.194: E/AndroidRuntime(13285): java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1 
04-07 17:49:02.194: E/AndroidRuntime(13285): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251) 
04-07 17:49:02.194: E/AndroidRuntime(13285): at java.util.ArrayList.get(ArrayList.java:304) 
04-07 17:49:02.194: E/AndroidRuntime(13285): at android.widget.SimpleExpandableListAdapter.getChildrenCount(SimpleExpandableListAdapter.java:255) 
04-07 17:49:02.194: E/AndroidRuntime(13285): at android.widget.ExpandableListConnector.refreshExpGroupMetadataList(ExpandableListConnector.java:561) 
04-07 17:49:02.194: E/AndroidRuntime(13285): at android.widget.ExpandableListConnector.expandGroup(ExpandableListConnector.java:682) 
04-07 17:49:02.194: E/AndroidRuntime(13285): at android.widget.ExpandableListView.handleItemClick(ExpandableListView.java:561) 
04-07 17:49:02.194: E/AndroidRuntime(13285): at android.widget.ExpandableListView.performItemClick(ExpandableListView.java:521) 
04-07 17:49:02.194: E/AndroidRuntime(13285): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2514) 
04-07 17:49:02.194: E/AndroidRuntime(13285): at android.widget.AbsListView$1.run(AbsListView.java:3168) 
04-07 17:49:02.194: E/AndroidRuntime(13285): at android.os.Handler.handleCallback(Handler.java:605) 
04-07 17:49:02.194: E/AndroidRuntime(13285): at android.os.Handler.dispatchMessage(Handler.java:92) 
04-07 17:49:02.194: E/AndroidRuntime(13285): at android.os.Looper.loop(Looper.java:137) 
04-07 17:49:02.194: E/AndroidRuntime(13285): at android.app.ActivityThread.main(ActivityThread.java:4424) 
04-07 17:49:02.194: E/AndroidRuntime(13285): at java.lang.reflect.Method.invokeNative(Native Method) 
04-07 17:49:02.194: E/AndroidRuntime(13285): at java.lang.reflect.Method.invoke(Method.java:511) 

JSON response

{ "email":[ 
    {"ID":"123","username":"dipakadmin"}, 
    {"ID":"3233","username":"raju"}, 
    {"ID":"5445","username":"hussain"} 
    ] 
, 
"fax":[ 
    {"ID":"6665","username":"mohammad"}, 
    {"ID":"9877","username":"raj"}, 
    {"ID":"87655","username":"aryan"} 
    ] 
, 
"upload": 
    [ 
    {"ID":"132322","username":"raja"}, 
    {"ID":"544333","username":"bala"}, 
    ] 
} 

這只是JSON響應的一個例子。真實的迴應有很多標籤。對於ExpandableListActivity

代碼樣品低於:

package com.ExpandableListActivity; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 
import android.app.ExpandableListActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.SimpleExpandableListAdapter; 
import android.widget.TextView; 

public class DocumentCenter extends ExpandableListActivity { 

    public static JSONObject jsonDocu=null; 
    JSONArray jArray = null; 
    JSONObject json_data = null; 
    JSONObject root = null; 

    List<List<Map<String, String>>> childs; 

    List<Map<String, String>> child1; 
    List<Map<String, String>> child2; 
    List<Map<String, String>> child3; 
    SimpleExpandableListAdapter adapter; 

    Map<String, String> childdata1; 

    public static String url3=null; 
    String strEmailNull=null; 
    String strFaxNull=null; 
    String strUploadNull=null; 
    public String user=null; 
    TextView txtMLSID; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main2); 

     user= TabBarExample.getJsonUser; 
     Log.e("log_tag","USERNAME On Document : "+user); 

     List<Map<String, String>> groups = new ArrayList<Map<String, String>>(); 

     child1 = new ArrayList<Map<String, String>>(); 
     child2 = new ArrayList<Map<String, String>>(); 
     child3 = new ArrayList<Map<String, String>>(); 

     url3 ="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 
     Log.e("log_tag","URL on DOCUMENT : "+url3); 
     try { 
      jsonDocu = JSONfunctions1.getJSONfromURL(url3); 
      JSONArray ary = jsonDocu.names(); 

      Log.e("log_tag","ary : "+ary .toString()); 

      for (int i1 = 0; i1 < ary.length(); i1++) { 
       String value =  ary.get(i1).toString(); 
       Log.e("log_tag","value : "+value); 
       strEmailNull= jsonDocu.getString(value); 
       if (!strEmailNull.equals("null")){ 
        try{ 
         Map<String, String> group1 = new HashMap<String, String>(); 
         group1.put("group", value); 
         //group1.put("group", value+(i1+1)); 
         groups.add(group1); 

         JSONArray email = jsonDocu.getJSONArray(value); 
         for(int i=0;i<email.length() ;i++){      
          childdata1 = new HashMap<String, String>(); 

          JSONObject e = email.getJSONObject(i+1); 
          childdata1.put("child", e.getString("ID")); 
          childdata1.put("child1", "Name: "+e.getString("name")); 
          childdata1.put("child2", "Size: "+e.getString("size")); 
          childdata1.put("child3", "Update: "+e.getString("lastUpdate")); 

          child1.add(childdata1); 
          childs = new ArrayList<List<Map<String, String>>>(); 
         } 
        }catch(JSONException e){ 
         Log.e("log_tag", "Error parsing data "+e.toString()); 
        } 
       } 
      } 
      childs.add(child1); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     adapter = new SimpleExpandableListAdapter(
      this, groups, R.layout.groups2, new String[] { "group" }, 
      new int[] { R.id.group }, childs, R.layout.childs2, 
      new String[] { "child1","child2" ,"child3"}, new int[] { R.id.child1, R.id.child2, R.id.child3}); 
     setListAdapter(adapter); 
    } 

    @Override 
    public boolean setSelectedChild(int groupPosition, int childPosition, 
     boolean shouldExpandGroup) { 
     //do something 
     Log.e("log_tag","setSelectedChild: "); 
     return super.setSelectedChild(groupPosition, childPosition, 
      shouldExpandGroup); 
    } 

    @Override 
    public void setSelectedGroup(int groupPosition) { 
     //do something 

     Log.e("log_tag","setSelectedGroup: "); 
     super.setSelectedGroup(groupPosition); 
    } 
} 
+0

你得到任何解決方案,請提供給我 – Harsha 2015-02-02 09:54:31

回答

1

這是我會怎麼做。當然,你可以像解析一樣使用解析。但是,我會使用jackson庫並根據響應創建一個對象類,並使用ObjectMapper,它看起來更加優雅,並且節省了解析時間。您可以根據您的需要像內部傳真和電子郵件類和列表在這裏添加更多的字段:

public class ResponseObject { 

private List<Email> email; 

/** 
* @return the email 
*/ 
public List<Email> getEmail() { 
    return email; 
} 

/** 
* @param email 
*   the email to set 
*/ 
public void setEmail(List<Email> email) { 
    this.email = email; 
} 

public static class Email { 
    private Integer ID; 
    private String username; 

    /** 
    * @return the ID 
    */ 
    public Integer getID() { 
     return ID; 
    } 

    /** 
    * @param ID 
    *   the ID to set 
    */ 
    public void setID(Integer ID) { 
     ID = ID; 
    } 

    /** 
    * @return the username 
    */ 
    public String getUsername() { 
     return username; 
    } 

    /** 
    * @param username 
    *   the username to set 
    */ 
    public void setUsername(String username) { 
     this.username = username; 
    } 
} 
} 

然後用BaseExpandableListAdapter這樣,進行更改,根據你的需要添加視圖:

import java.util.ArrayList; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseExpandableListAdapter; 

public class ResponseAdapter extends BaseExpandableListAdapter { 
private ArrayList<ResponseObject> responseList = new ArrayList<ResponseObject>(); 

public ResponseAdapter(ArrayList<ResponseObject> responseObject) { 
    this.responseList = responseObject; 
} 

@Override 
public Object getChild(int groupPosition, int childPosition) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public long getChildId(int groupPosition, int childPosition) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

@Override 
public View getChildView(int groupPosition, int childPosition, 
     boolean isLastChild, View convertView, ViewGroup parent) { 
    int ID = responseList.get(groupPosition).getEmail().get(childPosition) 
      .getID(); 
    String username = responseList.get(groupPosition).getEmail() 
      .get(childPosition).getUsername(); 
    return null; 
} 

@Override 
public int getChildrenCount(int groupPosition) { 
    return responseList.get(groupPosition).getEmail().size(); 
} 

@Override 
public Object getGroup(int groupPosition) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public int getGroupCount() { 
    return responseList.size(); 
} 

@Override 
public long getGroupId(int groupPosition) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

@Override 
public View getGroupView(int groupPosition, boolean isExpanded, 
     View parent, ViewGroup viewGroup) { 
    // Email group goes here 
    return null; 
} 

@Override 
public boolean hasStableIds() { 
    // TODO Auto-generated method stub 
    return false; 
} 

@Override 
public boolean isChildSelectable(int arg0, int arg1) { 
    // TODO Auto-generated method stub 
    return false; 
} 

} 
相關問題