2014-01-16 165 views
1

我有一個ListFragment需要一個URL來解析JSON使用GSON庫。對於抽射後臺任務:Android - GsonRequest返回null

public class LatestFragment extends ListFragment { 

    public LatestFragment() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.fragment_latest, container, 
       false); 

     return rootView; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     arrItemList = new ArrayList<ItemListModel>(); 
     va = new LatestAdapter(getActivity(), arrItemList); 

     loadItemList(1); 
    } 

    private void loadItemList(int page) { 
     mRequestQueue = Volley.newRequestQueue(getActivity()); 
     pd = ProgressDialog.show(getActivity(), null, "Loading..."); 

     // TODO use Volley param 
     currentPage = page; 
     param = "?page=" + currentPage; 

     String url = Constants.LATEST_ITEM_LIST + param; 

     GsonRequest<ItemListModel> myReq = new GsonRequest<ItemListModel>(
       Method.GET, url, ItemListModel.class, 
       createMyReqSuccessListener(), createMyReqErrorListener()); 

     mRequestQueue.add(myReq); 

    } 


    private Response.Listener<ItemListModel> createMyReqSuccessListener() { 
     return new Response.Listener<ItemListModel>() { 
      @Override 
      public void onResponse(ItemListModel response) { 
       try { 
        Log.d("response > ", response.toString()); 
        pd.dismiss(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      }; 
     }; 
    } 

    private Response.ErrorListener createMyReqErrorListener() { 
     return new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) {  
      } 
     }; 
    } 
} 

當我運行應用程序,它顯示的是response

這裏是ItemListModel

public class ItemListModel { 

    private String user_id; 
    private String item_id; 
    private String name; 
    private String price; 
    private String category; 
    private ThumbnailModel thumbnail; // not array list 

    public ItemListModel(){} 

    //getters 

    @Override 
    public String toString() { 
     return "ItemListModel [user_id=" + user_id + ", item_id=" + item_id 
       + ", name=" + name + ", price=" + price + ", category=" 
       + category + ", thumbnail=" + thumbnail + "]"; 
    } // ALL NULL 
} 

這反序列化這個JSON格式:

{ 
    "results": [ 
    { 
     "user_id": "1", 
     "item_id": "18630", 
     "name": "Unnamed Item", 
     "price": "0", 
     "description": "", 
     "created_at": "2014-01-16 15:31:36", 
     "thumbnail": { 
     "image50": "http://www.example.com/adsa.jpg", 
     "image100": "hhttp://www.example.com/adsa.jpg" 
     },... 

我做了什麼錯了?我應該堅持使用Volley的JSONArrayRequest嗎?嗯。

回答

2

您爲您的Json響應創建的模型存在問題。

{ 
    "results": [ 
    { 
     "user_id": "1", 
     "item_id": "18630", 
     "name": "Unnamed Item", 
     "price": "0", 
     "description": "", 
     "created_at": "2014-01-16 15:31:36", 
     "thumbnail": { 
     "image50": "http://www.example.com/adsa.jpg", 
     "image100": "hhttp://www.example.com/adsa.jpg" 
     },... 

嘗試喜歡本作的上述JSON響應

public class ItemListModel { 
    public ArrayList<Result> results; 

    @Override 
    public String toString() { 
     return "Response [results=" + results + "]"; 
    } 

    public ArrayList<Result> getResults() { 
     return results; 
    } 

} 

然後

public class Result { 

    private String user_id; 
    private String item_id; 
    private String name; 
    private String price; 
    private String description; 
    private String created_at; 
    private ThumbnailModel thumbnail; 
    public String getUser_id() { 
     return user_id; 
    } 

    public String getItem_id() { 
     return item_id; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getPrice() { 
     return price; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public String getCreated_at() { 
     return created_at; 
    } 

    public ThumbnailModel getThumbnail() { 
     return thumbnail; 
    } 

    @Override 
    public String toString() { 
     return "Result [user_id=" + user_id + ", item_id=" + item_id 
       + ", name=" + name + ", price=" + price + ", description=" 
       + description + ", created_at=" + created_at + ", thumbnail=" 
       + thumbnail + "]"; 
    } 

} 

最後一點

public class ThumbnailModel { 
private String image50; 
private String image100; 
public String getImage50() { 
    return image50; 
} 
public String getImage100() { 
    return image100; 
} 
@Override 
public String toString() { 
    return "ThumbnailModel [image50=" + image50 + ", image100=" + image100 
      + "]"; 
} 

}

這是上述的Json合適的型號。

編輯: -

private Response.Listener<ItemListModel> createMyReqSuccessListener() { 
     return new Response.Listener<ItemListModel>() { 
      @Override 
      public void onResponse(ItemListModel response) { 
       try { 
        Log.d("Name> ", response.getResults().get(0).getName());//Edited 
        Log.d("ThumbnailModel Image> ", response.getResults().get(0).getThumbnail().getImage100());//Edited 
        pd.dismiss(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      }; 
    }; 
} 

希望這會爲你工作。

+0

嘿你的解決方案的作品。但是,如何從'Result'和'ThumbnailModel'類中獲取String值? – AimanB

+0

@AimanB如果它有效,那麼不要忘記投票並接受答案。 –

+0

@AimanBI添加了獲取Result和ThumbnailModel類的代碼。再次檢查我的答案。 –