【问题标题】:json - how to correctly add ArrayList<String> items to ArrayList<CustomObject>json - 如何正确地将 ArrayList<String> 项添加到 ArrayList<CustomObject>
【发布时间】:2018-06-04 10:49:50
【问题描述】:

我有一个这样的json

{
"News": [
    {
        "data": {
            "id": "963426",
            "gallery": [
                {
                    "image_path": "/images/metbuat/images_d/963426_0.jpg"
                },
                {
                    "image_path": "/images/metbuat/images_d/963426_1.jpg"
                },
                {
                    "image_path": "/images/metbuat/images_d/963426_2.jpg"
                }
            ]
        }
    },
    {
        "data": {
            "id": "959846",
            "gallery": [
                {
                    "image_path": "/images/metbuat/images_d/959846_0.jpg"
                },
                {
                    "image_path": "/images/metbuat/images_d/959846_1.jpg"
                }
            ]
        }
    }
]
}

在解析这个 json 并从中获取数据时,我遇到了问题。它为每个新闻项目添加所有画廊图像。但其他值,如“观看”、“身体”正在添加正确

private ArrayList<FeedNewsItem> feedNewsItemArrayList;

JSONArray jsonArray = response.getJSONArray("News");
for (int i = 0; i < jsonArray.length() - 1; i++)
{
  JSONObject newsItem = jsonArray.getJSONObject(i);
  JSONObject data = newsItem.getJSONObject("data");

  imageUrl = "https://metbuat.az" + data.getString("image_t");
  titleText = data.getString("title");
  subTitleText = data.getString("sub_title");
  watched = data.getString("views_stats");
  body = data.getString("details_full");

  if (!data.getString("gallery").equals("false"))
  {
   JSONArray galleryJsonArray = data.getJSONArray("gallery");

   // I think problem is here. This block adding all news images to every single news item
   for (int j = 0; j < galleryJsonArray.length(); j++)
   {
     JSONObject imageJsonObject = galleryJsonArray.getJSONObject(j);
     imageURL = "https://metbuat.az" + imageJsonObject.getString("image_path");

     galleryImagesList.add(imageURL);
   }
 }

 // adding every news details to list one by one
    feedNewsItemArrayList.add(new FeedNewsItem(imageUrl, titleText, subTitleText, time,date, watched, body, addDateTimestamp, currentDate, galleryImagesList));
}
...
Intent newsIntent = new Intent(MainActivity.this, NewsActivity.class);
FeedNewsItem clickedItem = feedNewsItemArrayList.get(position);
newsIntent.putStringArrayListExtra(EXTRA_GALLERYLIST, clickedItem.getmGalleryArrayList());

因此,当打开特定新闻时,一切正常,但所有新闻的图库图片出现在单个新闻项中

这是 NewsActivity.java 类中画廊图像的代码

Intent intent = getIntent();
galleryImagesList = intent.getStringArrayListExtra(EXTRA_GALLERYLIST);
private void getGalleryImages()
{
    for (int i = 0; i < galleryImagesList.size(); i++)
    {
        final ImageView imageView = new ImageView(NewsActivity.this);
        imageView.setId(i);
        imageView.setPadding(2, 2, 2, 2);
        imageView.setLayoutParams(new LinearLayout.LayoutParams(250, 250));
        imageView.requestLayout();

        Picasso.get().load(galleryImagesList.get(i)).into(imageView);
        horizontalScrollLayout.addView(imageView);
    }
}

在这张图片中,我只需要在红色框中获取这张图片。相反,我在 json 中获取所有带有画廊属性的新闻的所有图像

https://i.stack.imgur.com/pfIrc.png

【问题讨论】:

    标签: java android arrays json arraylist


    【解决方案1】:

    试试这个 将以下依赖项添加到应用级 gradle 文件中。

    compile 'com.google.code.gson:gson:2.2.4'
    

    然后像下面这样做一些 pojo 类..

    public class GalleryItem{
    
    @SerializedName("image_path")
    private String imagePath;
    
    public void setImagePath(String imagePath){
        this.imagePath = imagePath;
    }
    
    public String getImagePath(){
        return imagePath;
    }
    
    @Override
    public String toString(){
        return 
            "GalleryItem{" + 
            "image_path = '" + imagePath + '\'' + 
            "}";
        }
    

    }

    public class NewsItem{
    
    @SerializedName("data")
    private Data data;
    
    public void setData(Data data){
        this.data = data;
    }
    
    public Data getData(){
        return data;
    }
    
    @Override
    public String toString(){
        return 
            "NewsItem{" + 
            "data = '" + data + '\'' + 
            "}";
        }
    

    }

    public class Response{
    
    @SerializedName("News")
    private List<NewsItem> news;
    
    public void setNews(List<NewsItem> news){
        this.news = news;
    }
    
    public List<NewsItem> getNews(){
        return news;
    }
    
    @Override
    public String toString(){
        return 
            "Response{" + 
            "news = '" + news + '\'' + 
            "}";
        }
     }
    

    然后在活动中像下面这样调用之后。

    try {
        AssetManager assetManager = getAssets();
        InputStream ims = assetManager.open("file.txt");
    
        Gson gson = new Gson();
        Reader reader = new InputStreamReader(ims);
    
        GsonParse gsonObj = gson.fromJson(reader, Response.class);
    }
    }catch(IOException e) {
        e.printStackTrace();
    
    }
    

    【讨论】:

    • 您使用 volley 进行 Web 服务调用。
    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    相关资源
    最近更新 更多