我正在尝试从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.
答案 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);
}