以下は私のコードスニペットとログカートです。 エラーログは、アダプタークラスのコードのこの行に私を誘導します。NullPointerException URLからリサイクルビューへのニュースアイコンを取得していて、URLにアイコンがありません
if (response.body().getIcons().size() > 0)
特にアンドロイドスタジオが条件getIcons()
がnullポインタエラーの発生を引き起こす可能性を秘めていることを私に警告します。
package com.example.hamisi.sportsnewsultra.Model;
import java.util.List;
/**
* Created by hamisi on 10/6/17.
*/
public class IconBetterIdea {
private String url;
private List<Icon> icons;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public List<Icon> getIcons() {
return icons;
}
public void setIcons(List<Icon> icons) {
this.icons = icons;
}
}
アイコンクラス。
package com.example.hamisi.sportsnewsultra.Model;
/**
* Created by hamisi on 10/6/17.
*/
public class Icon {
private String url;
private int width,height,bytes;
private String format,sha1sum;
private Object error;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getBytes() {
return bytes;
}
public void setBytes(int bytes) {
this.bytes = bytes;
}
public String getFormat() {
return format;
}
public void setFormat(String format) {
this.format = format;
}
public String getSha1sum() {
return sha1sum;
}
public void setSha1sum(String sha1sum) {
this.sha1sum = sha1sum;
}
public Object getError() {
return error;
}
public void setError(Object error) {
this.error = error;
}
}
アダプター。ここでは、エラーの原因が見つかったアンドロイドスタジオによって私に指されている行がどこにありますか。
package com.example.hamisi.sportsnewsultra.Adapter;
import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.example.hamisi.sportsnewsultra.Common.Common;
import com.example.hamisi.sportsnewsultra.Interface.IconBetterIdeaService;
import com.example.hamisi.sportsnewsultra.Interface.ItemClickListener;
import com.example.hamisi.sportsnewsultra.ListNews;
import com.example.hamisi.sportsnewsultra.Model.IconBetterIdea;
import com.example.hamisi.sportsnewsultra.Model.WebSite;
import com.example.hamisi.sportsnewsultra.R;
import com.squareup.picasso.Picasso;
import de.hdodenhof.circleimageview.CircleImageView;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
/**
* Created by hamisi on 10/6/17.
*/
class ListSourceViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener
{
ItemClickListener itemClickListener;
TextView source_title;
CircleImageView source_image;
public ListSourceViewHolder(View itemView) {
super(itemView);
source_image = (CircleImageView) itemView.findViewById(R.id.source_image);
source_title = (TextView)itemView.findViewById(R.id.source_name);
itemView.setOnClickListener(this);
}
public void setItemClickListener(ItemClickListener itemClickListener) {
this.itemClickListener = itemClickListener;
}
@Override
public void onClick(View view) {
itemClickListener.onClick(view,getAdapterPosition(),false);
}
}
public class ListSourceAdapter extends RecyclerView.Adapter<ListSourceViewHolder>{
private Context context;
private WebSite webSite;
private IconBetterIdeaService mService;
public ListSourceAdapter(Context context, WebSite webSite) {
this.context = context;
this.webSite = webSite;
mService = Common.getIconService();
}
@Override
public ListSourceViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View itemView = inflater.inflate(R.layout.source_layout,parent,false);
return new ListSourceViewHolder(itemView);
}
@Override
public void onBindViewHolder(final ListSourceViewHolder holder, int position) {
StringBuilder iconBetterAPI = new StringBuilder("https://icons.better-idea.org/allicons.json?url=");
iconBetterAPI.append(webSite.getSources().get(position).getUrl());
mService.getIconUrl(iconBetterAPI.toString())
.enqueue(new Callback<IconBetterIdea>() {
@Override
public void onResponse(@NonNull Call<IconBetterIdea> call, @NonNull Response<IconBetterIdea> response) {
if (response.body().getIcons().size() > 0)
{
Picasso.with(context)
.load(response.body().getIcons().get(0).getUrl())
.into(holder.source_image);
}
}
@Override
public void onFailure(Call<IconBetterIdea> call, Throwable t) {
}
});
holder.source_title.setText(webSite.getSources().get(position).getName());
holder.setItemClickListener(new ItemClickListener() {
@Override
public void onClick(View view, int position, boolean isLongClick) {
Intent intent = new Intent(context, ListNews.class);
intent.putExtra("source", webSite.getSources().get(position).getId());
intent.putExtra("sortBy", webSite.getSources().get(position).getSortBysAvailable().get(0)); //get detail sort by method
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return webSite.getSources().size();
}
}
エラーログは以下のとおりです。
10-11 11:41:47.328 27239から27239/com.example.hamisi.sportsnewsultra E/AndroidRuntime:致命的な例外:メイン プロセス:com.example.hamisi.sportsnewsultra、PID:27239 ジャワ.lang.NullPointerException: com.example.hamisi.sportsnewsultraでヌルオブジェクト参照 に ')(java.util.Listに com.example.hamisi.sportsnewsultra.Model.IconBetterIdea.getIconsを' 仮想メソッドを呼び出す試み.Adapter.ListSourceAdapter $ 1.onResponse(ListSourceAdapter.java:88) a android.os.Handler.handleCallback(Handler.java:815)でトン retrofit2.ExecutorCallAdapterFactory $ ExecutorCallbackCall $ 1 $ 1.run(ExecutorCallAdapterFactory.java:70) android.os.Handler.dispatchMessage(Handler.java:104)でandroid.os.Looper.loop(Looper.java:194)の とandroid.app.ActivityThread.main(ActivityThread.java:5637) のjava.lang.reflect.Method.invoke(ネイティブメソッド) at java .lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:960) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
@J Rameshありがとうございました。申し訳ありませんが、私は私の低い評判のためにあなたの答えをアップアップすることは許されていません。しかし、私は答えとしてそれをマークしています。神のお恵みがありますように。 –
@ArossMickdad歓迎兄弟...問題ありません –