【问题标题】:Unable to set JSON Objects in RecyclerView that has null objects无法在具有空对象的 RecyclerView 中设置 JSON 对象
【发布时间】:2018-09-25 07:07:06
【问题描述】:

我正在尝试解析来自 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.

【问题讨论】:

  • 什么是异常?发布日志。
  • 请发布你的日志
  • 出于测试目的尝试加载任何其他图像,如 ic_launcher 或其他任何图像。
  • 对于某些 imgUrl json 对象,该值为 null。这是错误的主要原因。
  • @rahulramakrishnan 答案是否有效?

标签: android json android-recyclerview


【解决方案1】:

问题是您正在为 Glide 设置一个 null Image url

"urlToImage":null, //Json 响应

你的 else 部分在这里被执行

        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 中把图像放在 drawable 中

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

【讨论】:

  • 将图像放在正确的可绘制文件夹中解决了问题
  • @rahulramakrishnan 接受作为答案,以便帮助他人
【解决方案2】:

请将此替换为适配器

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

【讨论】:

  • 如果仍然存在,您也面临同样的问题,请替换可绘制的任何其他图像。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多