【问题标题】:Recyclerview populate with jsonRecyclerview 填充 json
【发布时间】:2017-08-21 20:08:43
【问题描述】:

我想从 url 获取 json 数据以在用户界面上显示它。但未能以正确的顺序反序列化数据。我使用改造 1.9。问题是当我在没有任何图像反序列化功能(例如标题、正文、更新日期)的情况下运行此代码时,它工作正常。我可以看到带有标题和日期的回收站视图。但是当我尝试使用以下代码运行时,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);
        }
    });

【问题讨论】:

    标签: android json rest api deserialization


    【解决方案1】:
    appImages.setSrc(imageArray.optString(("src")));
    

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

    现在在适配器类中,

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

    希望这可行:)

    【讨论】:

    • 如何获取 TeaserImageSmall 的来源
    • 我不确定实现 JSONARRAY jsonarray=object.optString("appImages");。因为我已经定义了 json 数组。我要不要做两次。你能根据我的代码解释更多吗
    • 当然.. 不需要 TeaserImageSmall。你必须定义另一个 json 数组,因为在你的 json 中“appImages”有一个 json 数组数据,所以响应会给你一个你必须迭代的数组。您可以参考嵌套 json 数据的解析,这将对您有更多帮助。
    • 上面提供的代码已经基于你的代码了。我会在几分钟内更清楚它。
    • 我需要从 teaserImageSmall 获取 src。因为是封面图。但我无法从 json 中获取它。我刚刚修改了有问题的代码
    【解决方案2】:
     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");
    

    现在在适配器类中,

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

    希望这可行:)

    【讨论】:

    • 您的代码不起作用。我仍然无法理解你的代码
    • 哥们,这应该会解析你提供的上面的json。可能是轻微的打字错误在这里..但代码是正确的。这是基本的json解析
    • 我已经编辑了我的问题。我为 appimage 和 teaserImageSample 创建了单独的类。现在,如果我在没有图像数组部分的情况下运行我的代码,它就可以工作。那个时候只有标题和日期显示在recyclerview中。但如果我想用图像 url 代码运行它,recclerview 会变成空白。如果您需要我的模型类,那么我也可以在此代码中提供它。我不明白控制器类会出现什么问题。
    猜你喜欢
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 2019-04-26
    相关资源
    最近更新 更多