首页 > 解决方案 > 由于运行时出现空指针异常,无法填充回收站视图

问题描述

我正在尝试填充回收站视图并从服务器获取数据,但应用程序崩溃并显示以下错误。我无法得到实际错误的位置:

2021-02-15 13:28:02.425 21513-21513/com.app.itunes E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.app.itunes, PID: 21513
java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
    at c.b.a.h.b$a.b(:93)
    at c.b.a.h.b$a.a(:76)
    at androidx.lifecycle.LiveData.c(:133)
    at androidx.lifecycle.LiveData.d(:151)
    at androidx.lifecycle.LiveData.k(:309)
    at b.m.p.k(:50)
    at c.b.a.d.b$a.b(:50)
    at f.h$b$a$a.run(:71)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7356)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

下面是我的代码:

VideoRepository.java

public class VideoRepository {

Application application;
MutableLiveData<List<Result>> myVideos = new MutableLiveData<>();
List<Result> videos = new ArrayList<>();

public VideoRepository() {
    this.application = application;
}

public MutableLiveData<List<Result>> getMyVideos() {

    Retrofit retrofit = RetrofitClient.getInstance();
    ApiService apiService = retrofit.create(ApiService.class);

    Call<Video> videoList = apiService.getTracks("Michael+jackson", "musicVideo");

    videoList.enqueue(new Callback<Video>() {
        @Override
        public void onResponse(Call<Video> call, Response<Video> response) {

            Video video = (Video) response.body();

            if(response.body() != null){
                videos = video.getResults();
                myVideos.setValue(videos);
            }
        }

        @Override
        public void onFailure(Call<Video> call, Throwable t) {
            Toast.makeText(application,t.getMessage(),Toast.LENGTH_SHORT).show();
        }
    });

    return myVideos;
   }
}

VideoViewModel.java

 public class VideoViewModel extends ViewModel {

 VideoRepository videoRepository;

 public VideoViewModel(){

     videoRepository = new VideoRepository();
 }

 public LiveData<List<Result>> getVideoRepository() {
    return videoRepository.getMyVideos();
  }
}

视频片段.java

 private void loadTracks(){

       fragmentVideoBinding.videoRecycler.setHasFixedSize(true);
       fragmentVideoBinding.videoRecycler.setLayoutManager(new GridLayoutManager(getActivity(),2,GridLayoutManager.VERTICAL, false));

       videoViewModel = new ViewModelProvider(getActivity()).get(VideoViewModel.class);

       videoViewModel.getVideoRepository().observe(getActivity(), new Observer<List<Result>>() {
           @Override
           public void onChanged(List<Result> results) {

                    if(results.size() > 0){

                        fragmentVideoBinding.animEmpty.setVisibility(View.INVISIBLE);
                        videoList = results;
                        VideoAdapter adapter = new VideoAdapter(videoList,getActivity());
                        fragmentVideoBinding.videoRecycler.setItemAnimator(new DefaultItemAnimator());
                        fragmentVideoBinding.videoRecycler.setAdapter(adapter);
                    }
                    else{
                        fragmentVideoBinding.animEmpty.setVisibility(View.INVISIBLE);
                        Toast.makeText(getActivity(), "Nothing to show", Toast.LENGTH_SHORT).show();
                    }
             }
       });
  }

为什么我的应用程序崩溃了?

标签: javaandroidandroid-livedataandroid-viewmodel

解决方案


更新回购响应

 if(response.body() != null && video.getResults() != null){
        videos = video.getResults();
        myVideos.setValue(videos);
 }

其次:在您的适配器类中添加列表字段并尝试在适配器列表中添加项目,而不是直接分配。

videoList = results;
VideoAdapter adapter = new VideoAdapter(videoList,getActivity());

我在说 :

 VideoAdapter adapter = new VideoAdapter(getActivity());
 adapeter.setData(results);

或者

videos.addall(results);
VideoAdapter adapter = new VideoAdapter(videoList,getActivity());

推荐阅读