2012-07-11 67 views
0

我一直在這個問題上停留了兩個星期,希望有人能幫助我。提前致謝。Android GSON/JSON反序列化並顯示在適配器中

我想在一個活動中創建一個視圖,該活動由底部的標題視圖和列表視圖組成。到目前爲止,我已經成功地從JSON獲取數據到listView,因爲大多數教程只包含JSON和lis​​tView。

我的問題是,我怎麼能得到下面的數據顯示錶頭,簡單視圖(非ListView控件),甚至我想的觀點...

JSON文件

{ 
"photos" : [ 
    { 
    "thumbnail" : "http://www.myserver.com/01.jpg", 
    }, 
    { 
    "thumbnail" : "http://www.myserver.com/02.jpg", 
    }, 
    { 
    "thumbnail" : "http://www.myserver.com/03.jpg", 
    }, 
], 
"info" : [ 
    { 
    "id" : "1", 
    "description" : "My White Toyota", 
    "country" : "Japan", 
    "year" : "1982" 
    } 
]; 
"owners" : [ 
    { 
    "ownerid" : "5633432", 
    "name" : "Jackson", 
    "year_own" : "1982-1985" 
    }, 
    { 
    "ownerid" : "76832", 
    "name" : "Kurt", 
    "year_own" : "1986-1995" 
    }, 
    { 
    "ownerid" : "236471", 
    "name" : "Alma", 
    "year_own" : "1999-2005" 
    } 
    ] 
} 

List類

public class car_detail { 
    private List<CAR_INFO_MODEL> photos; 
    private List<CAR_INFO_MODEL> info; 
    private List<CAR_INFO_MODEL> owners; 

public List<CAR_INFO_MODEL> getPhotos(){ 
    return photos; 
} 
public void setPhotoList(List<CAR_INFO_MODEL> photos){ 
    this.photos = photos; 
} 

    public List<CAR_INFO_MODEL> getInfos(){ 
    return info; 
} 
public void setInfoList(List<CAR_INFO_MODEL> info){ 
    this.info = info; 
} 

    public List<CAR_INFO_MODEL> getOwners(){ 
    return owners; 
} 
public void setOwnerList(List<CAR_INFO_MODEL> owners){ 
    this.owners = owners; 
} 
} 

模型類

public class CAR_INFO_MODEL { 
private String description; 
private String year; 

private String thumbnail; 

private String name; 
private String year_own; 

public String getDesc() { 
    return description; 
} 
public void setDesc(String description) { 
    this.description = description; 
    } 
    public String getYear() { 
    return year; 
} 
public void setYear(String year) { 
    this.year = year; 
    } 
    public String getPhoto() { 
    return thumbnail; 
} 
public void setPhoto(String thumbnail) { 
    this.thumbnail = thumbnail; 
    } 
    public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
    } 
    public String getYearown() { 
    return year_own; 
} 
public void setYearown(String year_own) { 
    this.year_own = year_own; 
    } 
} 

活動類(我使用AsyncTask查詢並獲取JSON respose),我可以成功從JSON獲取信息對象,但不知道如何獲取照片和所有者。

public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.cardetail_layout); 

    lv = (ListView) findViewById(R.id.list_cardetail); 

    carArray = new ArrayList<CAR_INFO_MODEL>(); 
    carDetailAdapter = new carDetailAdapter(carActivity.this, R.layout.caritem_layout, infoArray); 
      lv.setAdapter(carDetailAdapter); 
      try { 
       new DealSync().execute("http://www.myserver.com/carsquery/"); 
      } catch(Exception e) {} 
} 


String json = client.getResponse(); 
list = new Gson().fromJson(json, car_detail.class); 

return list; 

protected void onPostExecute(car_detail infolist) { 

     for(CAR_INFO_MODEL lm : infolist.getInfo()) 
     { 
      infoArray.add(lm); 
     } 
     carDetailAdapter.notifyDataSetChanged(); 
    } 

適配器類(我可以得到的信息顯示爲一個單一的項目列表,但我不知道如何獲得這些照片,並從數據所有者(底部列表視圖),並顯示它。)

public class carDetailAdapter extends ArrayAdapter<CAR_INFO_MODEL> { 
int resource; 
String response; 
Context context; 
private LayoutInflater dInflater; 

public carDetailAdapter(Context context, int resource, List<CAR_INFO_MODEL> objects) { 
     super(context, resource, objects); 
     this.resource = resource; 
     dInflater = LayoutInflater.from(context); 
} 
static class ViewHolder { 

    TextView description; 

} 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    ViewHolder holder; 
    CAR_INFO_MODEL lm = (CAR_INFO_MODEL) getItem(position); 

    //Inflate the view 
    if(convertView==null) 
    { 
     convertView = dInflater.inflate(R.layout.carDetail_layout, null); 
     holder = new ViewHolder(); 
     holder.description = (TextView) convertView.findViewById(R.id.cardesc); 
     convertView.setTag(holder); 
    } 
    else 
    { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.description.setText(lm.getDesc()); 

    return convertView; 
} 

} 

這聽起來很複雜,只希望有人能給我一個幫助。謝謝你這麼多

+0

您是否需要從應用程序服務器下載圖片文件? – 2012-07-11 11:42:43

+0

@RyanGray是的,的確,我想我會使用universalimageloader ...謝謝 – 2012-07-11 11:46:20

回答

3

有一些問題,我注意到在你的邏輯

  • 首先使用的是不是JSON格式的所有JSON字符串的。 GSON解析器無法解析相同的字符串。

問題:

  • 沒有在照片的thumbnail變量的末尾附加逗號
  • info對象與;而不是,

修正JSON字符串是在這裏結束:

{ 
"photos" : [ 
    { 
    "thumbnail" : "http://www.myserver.com/01.jpg" 
    }, 
    { 
    "thumbnail" : "http://www.myserver.com/02.jpg" 
    }, 
    { 
    "thumbnail" : "http://www.myserver.com/03.jpg" 
    } 
], 
"info" : [ 
    { 
    "id" : "1", 
    "description" : "My White Toyota", 
    "country" : "Japan", 
    "year" : "1982" 
    } 
], 
"owners" : [ 
    { 
    "ownerid" : "5633432", 
    "name" : "Jackson", 
    "year_own" : "1982-1985" 
    }, 
    { 
    "ownerid" : "76832", 
    "name" : "Kurt", 
    "year_own" : "1986-1995" 
    }, 
    { 
    "ownerid" : "236471", 
    "name" : "Alma", 
    "year_own" : "1999-2005" 
    } 
    ] 
} 

現在的邏輯錯誤,我發現

  • CarDetails JSON數據包含三個對象。 1.照片列表2.一個信息對象和3.所有者列表
  • 但是,您的實現將它作爲一個三個CAR_INFO_MODEL列出此類中的所有數據。通過這樣做,您的JSON中存在的所有分類都已丟失。
  • 這是在這裏你的問題

爲了解決這個問題,分類你的數據作爲JSON代表它。這被示出在下面

Photo

public class Photo { 

    /** 
    * Constructor for Photo. 
    * @param thumbnail <tt></tt> 
    */ 
    public Photo(String thumbnail) { 
     super(); 
     this.thumbnail = thumbnail; 
    } 

    private String thumbnail; 

    /** 
    * Gets the thumbnail. 
    * 
    * @return <tt> the thumbnail.</tt> 
    */ 
    public String getThumbnail() { 
     return thumbnail; 
    } 

    /** 
    * Sets the thumbnail. 
    * 
    * @param thumbnail <tt> the thumbnail to set.</tt> 
    */ 
    public void setThumbnail(String thumbnail) { 
     this.thumbnail = thumbnail; 
    } 

    /* (non-Javadoc) 
    * @see java.lang.Object#toString() 
    */ 
    @Override 
    public String toString() { 
     return "Photo [thumbnail=" + thumbnail + "]"; 
    } 



} 

Info

public class Info { 
    /*"id" : "1", 
    "description" : "My White Toyota", 
    "country" : "Japan", 
    "year" : "1982" 

    * */ 

    private String id; 
    /** 
    * Constructor for Info. 
    * @param id 
    * @param description 
    * @param country 
    * @param year <tt></tt> 
    */ 
    public Info(String id, String description, String country, String year) { 
     super(); 
     this.id = id; 
     this.description = description; 
     this.country = country; 
     this.year = year; 
    } 
    private String description; 
    private String country; 
    private String year; 
    /** 
    * Gets the id. 
    * 
    * @return <tt> the id.</tt> 
    */ 
    public String getId() { 
     return id; 
    } 
    /** 
    * Sets the id. 
    * 
    * @param id <tt> the id to set.</tt> 
    */ 
    public void setId(String id) { 
     this.id = id; 
    } 
    /** 
    * Gets the description. 
    * 
    * @return <tt> the description.</tt> 
    */ 
    public String getDescription() { 
     return description; 
    } 
    /** 
    * Sets the description. 
    * 
    * @param description <tt> the description to set.</tt> 
    */ 
    public void setDescription(String description) { 
     this.description = description; 
    } 
    /** 
    * Gets the country. 
    * 
    * @return <tt> the country.</tt> 
    */ 
    public String getCountry() { 
     return country; 
    } 
    /** 
    * Sets the country. 
    * 
    * @param country <tt> the country to set.</tt> 
    */ 
    public void setCountry(String country) { 
     this.country = country; 
    } 
    /** 
    * Gets the year. 
    * 
    * @return <tt> the year.</tt> 
    */ 
    public String getYear() { 
     return year; 
    } 
    /** 
    * Sets the year. 
    * 
    * @param year <tt> the year to set.</tt> 
    */ 
    public void setYear(String year) { 
     this.year = year; 
    } 
    /* (non-Javadoc) 
    * @see java.lang.Object#toString() 
    */ 
    @Override 
    public String toString() { 
     return "Info [id=" + id + ", description=" + description + ", country=" 
       + country + ", year=" + year + "]"; 
    } 



} 

的 '所有者' 類

public class Owner { 
    /* 
    * "ownerid" : "5633432", 
    "name" : "Jackson", 
    "year_own" : "1982-1985" 

    * */ 

    private String ownerid; 
    /** 
    * Constructor for Owner. 
    * @param ownerid 
    * @param name 
    * @param year_own <tt></tt> 
    */ 
    public Owner(String ownerid, String name, String year_own) { 
     super(); 
     this.ownerid = ownerid; 
     this.name = name; 
     this.year_own = year_own; 
    } 
    private String name; 
    private String year_own; 
    /** 
    * Gets the ownerid. 
    * 
    * @return <tt> the ownerid.</tt> 
    */ 
    public String getOwnerid() { 
     return ownerid; 
    } 
    /** 
    * Sets the ownerid. 
    * 
    * @param ownerid <tt> the ownerid to set.</tt> 
    */ 
    public void setOwnerid(String ownerid) { 
     this.ownerid = ownerid; 
    } 
    /** 
    * Gets the name. 
    * 
    * @return <tt> the name.</tt> 
    */ 
    public String getName() { 
     return name; 
    } 
    /** 
    * Sets the name. 
    * 
    * @param name <tt> the name to set.</tt> 
    */ 
    public void setName(String name) { 
     this.name = name; 
    } 
    /** 
    * Gets the year_own. 
    * 
    * @return <tt> the year_own.</tt> 
    */ 
    public String getYear_own() { 
     return year_own; 
    } 
    /** 
    * Sets the year_own. 
    * 
    * @param year_own <tt> the year_own to set.</tt> 
    */ 
    public void setYear_own(String year_own) { 
     this.year_own = year_own; 
    } 
    /* (non-Javadoc) 
    * @see java.lang.Object#toString() 
    */ 
    @Override 
    public String toString() { 
     return "Owner [ownerid=" + ownerid + ", name=" + name + ", year_own=" 
       + year_own + "]"; 
    } 


} 

終於CarDetail

public class CarDetail { 

    private List<Photo> photos; 
    private List<Info> info; 
    private List<Owner> owners; 
    /** 
    * Gets the photos. 
    * 
    * @return <tt> the photos.</tt> 
    */ 
    public List<Photo> getPhotos() { 
     return photos; 
    } 
    /** 
    * Sets the photos. 
    * 
    * @param photos <tt> the photos to set.</tt> 
    */ 
    public void setPhotos(List<Photo> photos) { 
     this.photos = photos; 
    } 
    /** 
    * Gets the info. 
    * 
    * @return <tt> the info.</tt> 
    */ 
    public List<Info> getInfo() { 
     return info; 
    } 
    /** 
    * Sets the info. 
    * 
    * @param info <tt> the info to set.</tt> 
    */ 
    public void setInfo(List<Info> info) { 
     this.info = info; 
    } 
    /** 
    * Gets the owners. 
    * 
    * @return <tt> the owners.</tt> 
    */ 
    public List<Owner> getOwners() { 
     return owners; 
    } 
    /** 
    * Sets the owners. 
    * 
    * @param owners <tt> the owners to set.</tt> 
    */ 
    public void setOwners(List<Owner> owners) { 
     this.owners = owners; 
    } 
    /* (non-Javadoc) 
    * @see java.lang.Object#toString() 
    */ 
    @Override 
    public String toString() { 
     return "CarDetail [photos=" + photos + ", info=" + info + ", owners=" 
       + owners + "]"; 
    } 



} 

,並使用這些類如下解析並獲得存儲在每個對象(即,照片,所有者和信息)

String json = "{" + 
" \"photos\" : [" + 
" {" + 
"  \"thumbnail\" : \"http://www.myserver.com/01.jpg\"" + 
" }," + 
" {" + 
"  \"thumbnail\" : \"http://www.myserver.com/02.jpg\"" + 
" }," + 
" {" + 
"  \"thumbnail\" : \"http://www.myserver.com/03.jpg\"" + 
" }" + 
"]," + 
"\"info\" : [" + 
" {" + 
"  \"id\" : \"1\"," + 
"  \"description\" : \"My White Toyota\"," + 
"  \"country\" : \"Japan\"," + 
"  \"year\" : \"1982\"" + 
" }" + 
" ]," + 
"\"owners\" : [" + 
" {" + 
"  \"ownerid\" : \"5633432\"," + 
"  \"name\" : \"Jackson\"," + 
"  \"year_own\" : \"1982-1985\"" + 
" }," + 
" {" + 
"  \"ownerid\" : \"76832\"," + 
"  \"name\" : \"Kurt\"," + 
"  \"year_own\" : \"1986-1995\"" + 
" }," + 
" {" + 
"  \"ownerid\" : \"236471\"," + 
"  \"name\" : \"Alma\"," + 
"  \"year_own\" : \"1999-2005\"" + 
" }" + 
" ]" + 
"}"; 
// parsing the JSON string to CardDetail object 
CarDetail detail=new Gson().fromJson(json,CarDetail.class); 

// retrieving data from the CardDetail object 
List<Photo> photos = detail.getPhotos(); 
System.out.println("retrieving Photos"); 
for (Photo photo : photos) { 
    System.out.println(photo); 
} 

List<Info> info = detail.getInfo(); 
System.out.println("retrieving Info"); 
for (Info info2 : info) { 
    System.out.println(info2); 
} 
System.out.println("retrieving Owners"); 
List<Owner> owners = detail.getOwners(); 
for (Owner owner : owners) { 
    System.out.println(owner); 
} 

現在使用檢索到的數據在你的意見的細節。如果您需要任何幫助/幫助,請讓我知道

+0

@SArumik你能測試這個嗎? – sunil 2012-07-12 06:36:07

+0

非常感謝你,你救了我的一天...它完美的工作= D – 2012-07-14 02:54:28

+0

男人,你有一定的耐心.. +1 – DoruAdryan 2014-01-13 14:52:22

相關問題