Recyclerview填充json

时间:2017-08-21 20:08:44

标签: android json rest api deserialization

我想从url获取json数据以在用户界面上显示它。但未能按正确的顺序反序列化数据。我使用Retrofit 1.9。问题是当我运行此代码时,没有任何图像反序列化功能,例如title,body,updateDate,那时它工作正常。我可以看到带有标题和日期的recyclerview。但是当我尝试使用以下代码运行时,recyclerview变得空白。我什么都看不到。我正在努力确定。什么都没有解决我的问题。如果有人帮我确定问题,对我来说真的很有帮助。

控制器类

public class NewsController {
private static final String TAG = NewsController.class.getSimpleName();
private UserCallbackListener mListener;
private NewsRestApiManager mApiManager;

public NewsController(UserCallbackListener listener) {
    mListener = listener;
    mApiManager = new NewsRestApiManager();
}

public void startFetching(){

    mApiManager.getNewsApi().getNews(new Callback<String>() {

        @Override
        public void success(String s, Response response) {
            Log.d(TAG, "JSON :: " + s);

            try {
                JSONArray array = new JSONArray(s);

                for(int i = 0; i < array.length(); i++) {
                    JSONObject object = array.getJSONObject(i);

                    NewsModel news = new NewsModel();
                    news.setTitle( object.optString( "title") );
                    news.setBody( object.optString( "body" ) );

                   /* if I comment downd this postion the app run perfectly but except image*/
                    ArrayList<AppImage> list = new ArrayList();
                    JSONArray imageArray =object.getJSONArray("appImages");
                    for(int j=0; j<imageArray.length();j++){
                        AppImage appImages  = new AppImage();
                        appImages.setSrc(imageArray.getJSONObject( j ).getString( "src" ));
                        list.add(appImages);
                    }
                    news.setAppImages( list );

                // I want to set this image ad Heading Image
                    JSONObject jo=object.getJSONObject( "teaserImageSmall​" );
                    TeaserImageSmall coverImage=new TeaserImageSmall();
                    coverImage.setSrc( jo.optString( "src" ));
                    news.setTeaserImageSmall(coverImage);
                    mListener.onFetchProgress(news);

                }

            } catch (JSONException e) {
                mListener.onFetchFailed();
            }


            mListener.onFetchComplete();
        }

        @Override
        public void failure(RetrofitError error) {
            Log.d(TAG, "Error :: " + error.getMessage());
            mListener.onFetchComplete();
        }
    });

}
public interface UserCallbackListener{
    void onFetchStart();
    void onFetchProgress(NewsModel news);
    void onFetchProgress(List<NewsModel> userList);
    void onFetchComplete();
    void onFetchFailed();
}

}

我的适配器类是

 @Override
public void onBindViewHolder(NewsHolder holder, int position) {
    final NewsModel currentNews = mNews.get(position);
    Picasso.with(holder.itemView.getContext());
    Picasso.with(holder.itemView.getContext()).load(currentNews.getTeaserImageSmall().getSrc()).into( holder.newsImage );

    holder.newsHeadline.setText(currentNews.getTitle());
    holder.newsDate.setText(currentNews.getPostDate());
    holder.cardView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent i=new Intent(context,DetailNews.class);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            //i.putExtra("image",newsModel.getImage());
            i.putExtra("title",currentNews.getTitle());
            i.putExtra("body",currentNews.getBody());
            context.startActivity(i);
        }
    });

2 个答案:

答案 0 :(得分:0)

appImages.setSrc(imageArray.optString(("src")));

不要在这里使用Integer.parseInt,因为你在src中有一个String数据。 将此列表添加到此图像数组的迭代外的NewsModel.appImages=list;

现在在Adapter类中,

 holder.newsImage.appImage.get(position).getSrc();

希望这有效:)

答案 1 :(得分:0)

 NewsModel.AppImages appImages = new NewsModel.AppImages(); 
 appImages.setSrc(imageArray.optString(("src")));

不要在这里使用Integer.parseInt,因为你在src中有一个String数据。 将此列表添加到

 NewsModel.appImages=list;

此图像数组的外部迭代。

 JSONOBJECT Jo= object.getJsonObject("teaserImageSmall​");
 NewsModel.teaserImageSmall= Jo.optString("src");

现在在Adapter类中,

 holder.newsImage.setImage(mNews.appImage.get(position).getSrc());
 String cover= mNews.teaserImageSmall;

希望这有效:)