无法在RecyclerView中设置具有空对象的JSON对象

时间:2018-09-25 07:07:06

标签: android json android-recyclerview recycler-adapter

我正在尝试从newsapi.org解析JSON数据。这是我要在recyclerview中显示的示例json

"articles":[  
  {  
     "source":{  
        "id":"fox-news",
        "name":"Fox News"
     },
     "author":null,
     "title":"After the hurricane comes the deluge on South Carolina coast",
     "description":"Eleven days ago, Lee Gantt was at a Hurricane Florence party in her neighborhood in Georgetown, where the story goes that some houses haven't flooded from the Sampit River since they were built before the American Revolution.",
     "url":"http://www.foxnews.com/us/2018/09/25/after-hurricane-comes-deluge-on-south-carolina-coast.html",
     "urlToImage":null,
     "publishedAt":"2018-09-25T04:20:37Z",
     "content":"GEORGETOWN, S.C. – Eleven days ago, Lee Gantt was at a Hurricane Florence party in her neighborhood in Georgetown, where the story goes that some houses haven't flooded from the Sampit River since they were built before the American Revolution. She will spend… [+4401 chars]"
  }

我尝试过的代码。我无法在Recyclerview中显示所需的内容。该应用程序崩溃,发生致命异常。 logcat将错误指向Adapter类中的onBindViewHolder。

在MainActivity的else语句中,如果我更改为return; recyclerview没有显示任何内容

MainActivity.java

 JSONObject jsonObject = new JSONObject(sResponse);
                JSONArray jsonArray = jsonObject.getJSONArray("articles");
                for (int k = 0; k < jsonArray.length(); k++) {
                    JSONObject jsonObject1 = jsonArray.getJSONObject(k);
                    HeadlinesListItem listItem = new HeadlinesListItem();
                    listItem.setsTitle(jsonObject1.getString("title"));
                    if (!jsonObject1.isNull("urlToImage")) {
                        listItem.setsUrlToImage(jsonObject1.getString("urlToImage"));
                    } else {
                        listItem.setsUrlToImage(null);
                    }
                    mNewsList.add(listItem);

Adapter.java

private Context context;
private List<HeadlinesListItem> mNewsItems;
private MyAdapterListener myAdapterListener;
private LayoutInflater mLayoutInflator;

TopHeadlinesAdapter(Context context, List<HeadlinesListItem> mNewsItems, MyAdapterListener clickListener) {
    this.context = context;
    this.mNewsItems = mNewsItems;
    mLayoutInflator = LayoutInflater.from(context);
    myAdapterListener = clickListener;
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.top_headlines_adapter, viewGroup, false);
    return new CustomViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
    CustomViewHolder myHolder = (CustomViewHolder) viewHolder;
    HeadlinesListItem listItems = mNewsItems.get(i);
    myHolder.lblHedLine.setText(listItems.getsTitle());
    if (listItems.getsUrlToImage().isEmpty()) {
        Glide.with(context).load(R.drawable.noimage).into(myHolder.imgImage);
    }else{
        Glide.with(context).load(listItems.getsUrlToImage()).apply(new RequestOptions().placeholder(R.drawable.noimage)).into(myHolder.imgImage);
    }

}

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

Logcat

09-25 12:16:25.867 28309-28309/com.example.rahul.newsapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.rahul.newsapp, PID: 28309
android.content.res.Resources$NotFoundException: Resource ID #0x7f07006c
    at android.content.res.Resources.getValue(Resources.java:2345)
    at android.content.res.Resources.getDrawable(Resources.java:1850)
    at android.support.v4.content.res.ResourcesCompat.getDrawable(ResourcesCompat.java:82)
    at com.bumptech.glide.load.resource.drawable.DrawableDecoderCompat.loadDrawableV4(DrawableDecoderCompat.java:76)
    at com.bumptech.glide.load.resource.drawable.DrawableDecoderCompat.getDrawable(DrawableDecoderCompat.java:64)
    at com.bumptech.glide.load.resource.drawable.DrawableDecoderCompat.getDrawable(DrawableDecoderCompat.java:41)
    at com.bumptech.glide.request.SingleRequest.loadDrawable(SingleRequest.java:388)
    at com.bumptech.glide.request.SingleRequest.getPlaceholderDrawable(SingleRequest.java:369)
    at com.bumptech.glide.request.SingleRequest.begin(SingleRequest.java:262)
    at com.bumptech.glide.manager.RequestTracker.runRequest(RequestTracker.java:44)
    at com.bumptech.glide.RequestManager.track(RequestManager.java:614)
    at com.bumptech.glide.RequestBuilder.into(RequestBuilder.java:646)
    at com.bumptech.glide.RequestBuilder.into(RequestBuilder.java:706)
    at com.example.rahul.newsapp.TopHeadlinesAdapter.onBindViewHolder(TopHeadlinesAdapter.java:48)
    at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6781)
    at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6823)
    at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5752)
    at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6019)
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858)
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854)
    at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230)
    at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557)
    at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
    at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)
    at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3924)
    at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:3336)
    at android.view.View.measure(View.java:18557)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5827)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1435)
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:721)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:612)
    at android.view.View.measure(View.java:18557)
    at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:2017)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
    at android.widget.ScrollView.onMeasure(ScrollView.java:487)
    at android.view.View.measure(View.java:18557)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5827)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
    at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
    at android.view.View.measure(View.java:18557)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5827)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1435)
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:721)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:612)
    at android.view.View.measure(View.java:18557)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5827)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
    at android.view.View.measure(View.java:18557)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5827)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1435)
    at android.widget.LinearLayout.

2 个答案:

答案 0 :(得分:1)

存在问题是您将空图片网址设置为Glide

“ urlToImage”:null,// Json响应

您的其他部分正在执行中

        if (!jsonObject1.isNull("urlToImage")) {
                 listItem.setsUrlToImage(jsonObject1.getString("urlToImage"));
                } else {
                    listItem.setsUrlToImage(null);

 if (listItems.getsUrlToImage().isEmpty()) {
        Glide.with(context).load(R.drawable.noimage).into(myHolder.imgImage);
    }else{
        Glide.with(context).load(listItems.getsUrlToImage()).apply(new RequestOptions().placeholder(R.drawable.noimage)).into(myHolder.imgImage);
//You are getting null here
    }

在这里出现错误是因为将Drawable放置在drawableV24中而不是将其放置在drawable中

Glide.with(context).load(R.drawable.noimage).into(myHolder.imgImage);

答案 1 :(得分:0)

请将其替换为适配器

    String imageUrl = listItems.getsUrlToImage();
    if (imageUrl == null) {
        Glide.with(context).load(R.drawable.noimage).into(myHolder.imgImage);
    }else{
        Glide.with(context).load(imageUrl).apply(new RequestOptions().placeholder(R.drawable.noimage)).into(myHolder.imgImage);
    }