2014-01-16 3 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" 
     },... 

Что я сделал не так на этот раз? Должен ли я просто придерживаться JSONArrayRequest от Volley? Гектометр

ответ

2

Проблема с вашей моделью, которую вы создали для Json Response.

{ 
    "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 Response

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.

Edit: -

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

Эй, ваше решение работает. Но как мне получить значение String из класса «Результат» и «ThumbnailModel»? – AimanB

+0

@AimanB если он работает, тогда не забудьте проголосовать и принять ответ. –

+0

@AimanBI добавил код для получения класса Result и ThumbnailModel. Повторите мой ответ. –

Смежные вопросы