【问题标题】:Attempt to invoke interface method 'int java.util.List.size()' on a null object How Solve It? [duplicate]尝试在空对象上调用接口方法“int java.util.List.size()”如何解决? [复制]
【发布时间】:2018-06-07 18:37:04
【问题描述】:

错误日志 -

java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
                          at in.hareshsaliya.itijobs.Adapter.ListSourceAdapter.getItemCount(ListSourceAdapter.java:115)
                          at android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3603)
                          at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3408)
                          at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3962)
                          at android.view.View.layout(View.java:17953)
                          at android.view.ViewGroup.layout(ViewGroup.java:5717)
                          at android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:610)
                          at android.view.View.layout(View.java:17953)
                          at android.view.ViewGroup.layout(ViewGroup.java:5717)
                          at android.widget.FrameLayout.layoutChildren(FrameLayout.java:383)
                          at android.widget.FrameLayout.onLayout(FrameLayout.java:321)
                          at android.view.View.layout(View.java:17953)
                          at android.view.ViewGroup.layout(ViewGroup.java:5717)
                          at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1982)
                          at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1826)
                          at android.widget.LinearLayout.onLayout(LinearLayout.java:1735)
                          at android.view.View.layout(View.java:17953)
                          at android.view.ViewGroup.layout(ViewGroup.java:5717)
                          at android.widget.FrameLayout.layoutChildren(FrameLayout.java:383)
                          at android.widget.FrameLayout.onLayout(FrameLayout.java:321)
                          at android.view.View.layout(View.java:17953)
                          at android.view.ViewGroup.layout(ViewGroup.java:5717)
                          at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1982)
                          at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1826)
                          at android.widget.LinearLayout.onLayout(LinearLayout.java:1735)
                          at android.view.View.layout(View.java:17953)
                          at android.view.ViewGroup.layout(ViewGroup.java:5717)
                          at android.widget.FrameLayout.layoutChildren(FrameLayout.java:383)
                          at android.widget.FrameLayout.onLayout(FrameLayout.java:321)
                          at com.android.internal.policy.DecorView.onLayout(DecorView.java:753)
                          at android.view.View.layout(View.java:17953)
                          at android.view.ViewGroup.layout(ViewGroup.java:5717)
                          at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2715)
                          at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2383)
                          at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1470)
                          at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7001)
                          at android.view.Choreographer$CallbackRecord.run(Choreographer.java:910)
                          at android.view.Choreographer.doCallbacks(Choreographer.java:712)
                          at android.view.Choreographer.doFrame(Choreographer.java:646)
                          at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:896)
                          at android.os.Handler.handleCallback(Handler.java:836)
                          at android.os.Handler.dispatchMessage(Handler.java:103)
                          at android.os.Looper.loop(Looper.java:203)
                          at android.app.ActivityThread.main(ActivityThread.java:6293)
                          at java.lang.reflect.Method.invoke(Native Method)
                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1084)
                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:945)

代码 -

这是我的适配器代码**

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

这里有问题**

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

    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(Call<IconBetterIdea> call, 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 postion, boolean isLongClick) {

            }
        });
    }

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

在此处初始化并调用适配器

`

RecyclerView listWebsite;
    RecyclerView.LayoutManager layoutManager;
    NewsService mService;
    ListSourceAdapter adapter;
    android.app.AlertDialog dialog;
    SwipeRefreshLayout swipeRefreshLayout;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_news);


    Paper.init(this);

    swipeRefreshLayout = (SwipeRefreshLayout)findViewById(R.id.swipeRefresh);
    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            loadWebsiteSource(true);
        }
    });

    mService = Common.getNewsService();

    listWebsite = (RecyclerView)findViewById(R.id.list_source);
    listWebsite.setHasFixedSize(true);
    layoutManager = new LinearLayoutManager(this);
    listWebsite.setLayoutManager(layoutManager);

    dialog = new SpotsDialog(this);

    loadWebsiteSource(false);

}

private void loadWebsiteSource(boolean isRefreshed) {

    if (!isRefreshed)
    {
        String cache = Paper.book().read("cache");
        if (cache != null && !cache.isEmpty())
        {
            WebSite webSite = new Gson().fromJson(cache, WebSite.class);
            adapter = new ListSourceAdapter(getBaseContext(),webSite);
            adapter.notifyDataSetChanged();
            listWebsite.setAdapter(adapter);

        } else
        {
            dialog.show();
            mService.getSources().enqueue(new Callback<WebSite>() {
                @Override
                public void onResponse(Call<WebSite> call, Response<WebSite> response) {
                    adapter = new ListSourceAdapter(getBaseContext(),response.body());
                    adapter.notifyDataSetChanged();
                    listWebsite.setAdapter(adapter);

                    Paper.book().write("cache",new Gson().toJson(response.body()));
                }

                @Override
                public void onFailure(Call<WebSite> call, Throwable t) {

                }
            });
        }

    }
    else
    {

        dialog.show();
        mService.getSources().enqueue(new Callback<WebSite>() {
            @Override
            public void onResponse(Call<WebSite> call, Response<WebSite> response) {
                adapter = new ListSourceAdapter(getBaseContext(),response.body());
                adapter.notifyDataSetChanged();
                listWebsite.setAdapter(adapter);

                Paper.book().write("cache",new Gson().toJson(response.body()));

                swipeRefreshLayout.setRefreshing(false);
            }

            @Override
            public void onFailure(Call<WebSite> call, Throwable t) {

            }
        });
    }

}

`

【问题讨论】:

  • 分享你的代码..
  • 你能添加你的代码吗?
  • 如日志中的 ListSourceAdapter.java:115 行,arraylist 为 NULL。您正在使用空对象访问方法
  • 在访问 List 之前尝试初始化它而不是共享您的代码
  • “我为什么会得到”?以及您如何期待没有任何代码的答案。程序员在这里不是魔术师。

标签: java android interface android-recyclerview


【解决方案1】:

使用初始化创建您的列表引用,如下所示

List list = new ArrayList();

如果你想更新现有的使用以下

list.clear();
list.addAll(newList);

就是这样。如果未修复,请先发布您的代码。

【讨论】:

    【解决方案2】:

    你没有将你的数组列表传递给这个适配器类。你怎么能期望它不会给出空指针异常。

    初始化数组列表为-:

    ArrayList list=new ArrayList();
    
    public ListSourceAdapter(Context context, ArrayList list) {
        this.context = context;
        this.list = list;
    
        mService = Common.getIconService();
    }
    

    如果是回收站视图,请将此适配器称为:

    adapter=new ListSourceAdapter(context,list);
    recyclerview.setAdapter(adapter);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 2016-07-28
      • 2020-08-25
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多