java - 从 Json 数据获取图像并将其显示为 RecyclerView android 中的封面图像

标签 java android json deserialization picasso

我正在尝试从 Rest Api 获取 json 数据,反序列化它并将其显示给 RecyclerView。

我正在使用改造1.9。在 JSONArray(s) 中,我可以在 logcat 中看到数据 api。

我可以反序列化 json 数组之外的数据,如正文、标题等。

但是 json 中有一些图像作为数组。我为 appimage 和 testImage 创建了两个静态内部类。

AppImage 有 3 或 4 个图像。测试图像只有一个图像源。

首先我想获取 TeaserimageSample 将其设置为 RecyclerView 标题图像。

我正在尝试从中获取 src 值。但无法得到如何做。

我还想知道我的模型类根据给定的 JSON 是否正确。我在代码里面已经详细解释了。

编辑 Controller 类

    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" ) );

                        ArrayList<NewsModel.AppImage> list = new ArrayList();
                        JSONArray imageArray =object.getJSONArray("appImages");
                        for(int j=0; j<imageArray.length();j++){
                            NewsModel.AppImage appImages  = new NewsModel.AppImage();
                            appImages.setSrc(imageArray.getJSONObject( j ).getString( "src" ));
                            list.add(appImages);
                        }
                        news.setAppImages( list );

                        JSONObject jo=object.getJSONObject( "teaserImageSmall​" );
                        NewsModel.TeaserImageSmall coverImage=new NewsModel.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();
    }
}

我编辑的适配器类,我在其中设置 picasso 设置封面图像的图像。但我在 recyclerview 中仍然看不到任何内容

...............
    // create new views (invoked by the layout manager)
    @Override
    public NewsHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.news_row_layout,parent,false);
        return new NewsHolder(view);
    }

    @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.newsImage.setImageResource( R.drawable.image1 );
        holder.newsHeadline.setText(currentNews.getTitle());
        holder.newsDate.setText(currentNews.getPostDate());

    }

    @Override
    public int getItemCount() {
        return mNews.size();
    }


    public class NewsHolder extends RecyclerView.ViewHolder {

        public CardView cardView;
        public ImageView newsImage;
        public TextView newsHeadline;
        public TextView newsDate;

        public NewsHolder(View itemView) {
            super(itemView);
            newsImage=(ImageView)itemView.findViewById(R.id.news_picture);
            newsHeadline=(TextView)itemView.findViewById(R.id.news_headline);
            newsDate=(TextView) itemView.findViewById(R.id.news_date);
            cardView=(CardView)itemView.findViewById(R.id.cardview_news);
        }
    }
}

最佳答案

appImages.setSrc( imageArray.optString( Integer.parseInt( "src") )

这向您显示错误,因为您正在以 String 形式接收“src”,并且尝试将其用作 int

关于java - 从 Json 数据获取图像并将其显示为 RecyclerView android 中的封面图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45815001/

相关文章:

java - 如何在 src 的 imageView 中设置正确的方向

java - AChartEngine 条形图中网格线上方的图表

android - FFMpeg 估计执行时间

Javascript解析html,修改包含图片的 anchor 标签

javascript - 使用 php、javascript 和 json 添加 map 标记

java - 使用beanshell在jmeter中获取json响应

java - java中基于表单的身份验证

java - Java的流过滤器是创建一个新列表还是指向原始列表?

java - 如何克服 Java 中的不准确问题

java - App Engine 异常,如何在 Android 中捕获