首页 > 解决方案 > Retrofit 2 获取数据到 Listview Viewholder 模式,java.util.ArrayList.size 上的空指针异常

问题描述

我正在尝试使用列表视图视图上的适配器通过 Retrofit 获取数据。
java.lang.NullPointerException:尝试在 ViewHolder 适配器第一行和 ViewholderFragment listView.setAdapter 行上的空对象引用上调用虚拟方法“int java.util.ArrayList.size()”。我的代码如下。我不知道我能做什么以及问题出在哪里。

谁能帮我克服这个问题?

ViewholderAdapter.java

公共类 ViewholderAdapter 扩展 ArrayAdapter{

@Override
public  int getCount(){return items.size(); }   //java.lang.NullPointerException  

@Override
public Result getItem(int position){
    return items.get(position);
}
public long getItemId(int position){
    return position;
}

private class ViewHolder
{
     TextView movie_year;
     TextView movie_title;
     TextView movie_desc;
     ImageView movie_poster;
    public ViewHolder(View view)
    {
        movie_year =(TextView)view.findViewById(R.id.movie_year);
        movie_title =(TextView)view.findViewById(R.id.movie_title);
        movie_desc =(TextView) view.findViewById(R.id.movie_desc);
        movie_poster =(ImageView)view.findViewById(R.id.movie_poster);

    }

}

@Override
public View getView(int position,View convertview,ViewGroup parent)
{   View view=convertview;
    ViewHolder holder;
    if(view==null)
    {
        view=LayoutInflater.from(context).inflate(R.layout.viewholder_item,parent,false);
        holder=new ViewHolder(view);
        view.setTag(holder);
    }
    else
        {
            holder=(ViewHolder) view.getTag();
        }

        holder.movie_title.setText(items.get(position).getTitle());

    return view;
 }
}

ViewHolderFragment.Java

public ViewHolderFragment() {}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup fragmentContainer, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_view_holder, fragmentContainer, false);
    ButterKnife.bind(this, view);
    return view;
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    ListView listView = (ListView) getActivity().findViewById(R.id.listView);
    listView.setAdapter(adapter);  //java.lang.NullPointerException: 
    adapter =  new ViewholderAdapter (getContext());
    movieService = MovieApi.getClient().create(MovieService.class);
    loadFirstPage();
}
private void loadFirstPage() {
    Log.d(TAG, "loadFirstPage: ");
    callTopRatedMoviesApi().enqueue(new Callback<TopRatedMovies>() {
        @Override
        public void onResponse(Call<TopRatedMovies> call, Response<TopRatedMovies> response) {
            List<Result> results = fetchResults(response);
     adapter.addAll(results);
        }

        @Override
        public void onFailure(Call<TopRatedMovies> call, Throwable t) {
            t.printStackTrace();

        }
    });

}
private List<Result> fetchResults(Response<TopRatedMovies> response) {
    TopRatedMovies topRatedMovies = response.body();

    return topRatedMovies.getResults();
}
private Call<TopRatedMovies> callTopRatedMoviesApi() {
    return movieService.getTopRatedMovies(
            getString(R.string.my_api_key),
            "en_US",
            currentPage
    );
 }

}

标签: apiandroid-fragmentsarraylistandroid-arrayadapterretrofit2

解决方案


推荐阅读