问题描述
我是android的新手,我试图制作一个包含音乐的列表视图。该应用程序是完美构建的,但是当我尝试在设备上运行它时会崩溃,我尝试调试该应用程序并对其进行调试给了我上面的错误。这是我的以下代码。
FragmentHome.java
package lrandomdev.com.online.mp3player.fragments;
import......;
public class FragmentHome extends FragmentParent {
private FragmentHome.OnFragmentInteractionListener mListener;
RecyclerView rcTopAlbums,rcTopArtists,rcNewReleases,rcNewPlaylists,rcCategories;
Button btnMoreAlbums,btnMoreArtists,btnMoreNew,btnMoreNewPlaylists,btnMoreCategory;
AdapterAlbum adapterAlbum;
AdapterArtist adapterArtist;
AdapterPlaylist adapterPlaylist;
AdapterTrack adapterTrack;
AdapterCategories adapterCategories;
ArrayList<Album> albums = new ArrayList<>();
ArrayList<Artist> artists = new ArrayList<>();
ArrayList<Playlist> playlists = new ArrayList<>();
ArrayList<Track> tracks = new ArrayList<>();
ArrayList<Categories> categories = new ArrayList<>();
ApiServices apiServices;
SliderLayout sliderLayout;
public static final FragmentHome newInstance() {
FragmentHome fragment = new FragmentHome();
return fragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
apiServices=RestClient.getApiService();
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater,@Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_home,container,false);
rcTopAlbums= (RecyclerView) view.findViewById(R.id.rcTracks);
rcTopArtists=(RecyclerView)view.findViewById(R.id.rcTopArtist);
rcNewReleases=(RecyclerView)view.findViewById(R.id.rcNewReleases);
rcNewPlaylists=(RecyclerView)view.findViewById(R.id.rcNewPlaylists);
rcCategories=(RecyclerView)view.findViewById(R.id.rcCategory);
btnMoreAlbums=(Button) view.findViewById(R.id.btnMoreAlbums);
btnMoreArtists=(Button) view.findViewById(R.id.btnMoreArtists);
btnMoreNew=(Button) view.findViewById(R.id.btnMoreNew);
btnMoreNewPlaylists=(Button) view.findViewById(R.id.btnMoreNewPlaylists);
btnMoreCategory = (Button) view.findViewById(R.id.btnMoreCategory);
btnMoreAlbums.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mListener.goToAlbum(null);
}
});
btnMoreArtists.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mListener.goToArtist(null);
}
});
btnMoreNewPlaylists.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mListener.goToPlaylist(null);
}
});
btnMoreCategory.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mListener.goToCategory();
}
});
btnMoreNew.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mListener.goToTrack(null,false);
}
});
loadAlbums();
loadArtists();
loadPlaylist();
loadTrack();
loadCategory();
LinearLayout adView = (LinearLayout)view.findViewById(R.id.adView);
Helpers.loadAd(getActivity(),adView);
return view;
}
void loadAlbums(){
albums.clear();
adapterAlbum=new AdapterAlbum(getActivity(),albums,R.layout.row_home_album_item_grid);
rcTopAlbums.setLayoutManager(new LinearLayoutManager(getActivity(),LinearLayoutManager.HORIZONTAL,false));
rcTopAlbums.setHasFixedSize(true);
rcTopAlbums.setAdapter(adapterAlbum);
Call<ArrayList<Album>> call= apiServices.getAlbums(0,10,null);
call.enqueue(new Callback<ArrayList<Album>>() {
@Override
public void onResponse(Call<ArrayList<Album>> call,Response<ArrayList<Album>> response) {
for (Album album:response.body()
) {
albums.add(album);
}
adapterAlbum.notifyDataSetChanged();
}
@Override
public void onFailure(Call<ArrayList<Album>> call,Throwable t) {
}
});
adapterAlbum.setOnItemClickListener(new AdapterAlbum.OnItemClickListener() {
@Override
public void onItemClick(View view,int position) {
mListener.goToTrackInAlbum(albums.get(position).getId(),true);
}
});
}
void loadArtists(){
artists.clear();
adapterArtist=new AdapterArtist(getActivity(),artists,R.layout.row_home_artist_item);
rcTopArtists.setLayoutManager(new LinearLayoutManager(getActivity(),false));
rcTopArtists.setHasFixedSize(true);
rcTopArtists.setAdapter(adapterArtist);
Call<ArrayList<Artist>> call= apiServices.getArtists(0,null);
call.enqueue(new Callback<ArrayList<Artist>>() {
@Override
public void onResponse(Call<ArrayList<Artist>> call,Response<ArrayList<Artist>> response) {
for (Artist artist:response.body()
) {
artists.add(artist);
}
adapterArtist.notifyDataSetChanged();
}
@Override
public void onFailure(Call<ArrayList<Artist>> call,Throwable t) {
}
});
adapterArtist.setOnItemClickListener(new AdapterArtist.OnItemClickListener() {
@Override
public void onItemClick(View view,int position) {
mListener.goToTrackInArtist(artists.get(position).getId(),true);
}
});
}
void loadPlaylist(){
playlists.clear();
adapterPlaylist = new AdapterPlaylist(getActivity(),playlists,R.layout.row_home_playlist_item_grid);
rcNewPlaylists.setLayoutManager(new LinearLayoutManager(getActivity(),false));
rcNewPlaylists.setHasFixedSize(true);
rcNewPlaylists.setAdapter(adapterPlaylist);
Call<ArrayList<Playlist>> call= apiServices.getPlaylists(0,null);
call.enqueue(new Callback<ArrayList<Playlist>>() {
@Override
public void onResponse(Call<ArrayList<Playlist>> call,Response<ArrayList<Playlist>> response) {
for (Playlist playlist:response.body()
) {
playlists.add(playlist);
}
adapterArtist.notifyDataSetChanged();
}
@Override
public void onFailure(Call<ArrayList<Playlist>> call,Throwable t) {
}
});
adapterPlaylist.setOnItemClickListener(new AdapterPlaylist.OnItemClickListener() {
@Override
public void onItemClick(View view,int position) {
mListener.goToTrackInPlaylist((int)playlists.get(position).getId(),true);
}
});
}
LinearLayoutManager myLinearLayoutManager = new LinearLayoutManager(getActivity()){
@Override
public boolean canScrollVertically() {
return false;
}
};
void loadTrack(){
tracks.clear();
adapterTrack = new AdapterTrack(getActivity(),tracks,R.layout.row_track_item);
rcNewReleases.setLayoutManager(new LinearLayoutManager(getActivity(),LinearLayoutManager.VERTICAL,false){
@Override
public boolean canScrollVertically() {
return false;
}
});
rcNewReleases.setHasFixedSize(true);
rcNewReleases.setAdapter(adapterTrack);
Call<ArrayList<Track>> call= apiServices.getTracks(0,null);
call.enqueue(new Callback<ArrayList<Track>>() {
@Override
public void onResponse(Call<ArrayList<Track>> call,Response<ArrayList<Track>> response) {
for (Track track:response.body()
) {
tracks.add(track);
}
adapterTrack.notifyDataSetChanged();
}
@Override
public void onFailure(Call<ArrayList<Track>> call,Throwable t) {
}
});
adapterTrack.setOnItemClickListener(new AdapterTrack.OnItemClickListener() {
@Override
public void onItemClick(View view,int position) {
Intent intent = new Intent(ActivityHome.ON_TRACK_CLICK_PLAY);
Bundle bundle = new Bundle();
bundle.putInt("TRACK_INDEX",position);
bundle.putSerializable("TRACKS",tracks);
intent.putExtra("ON_TRACK_CLICK_ITEM",bundle);
getActivity().sendBroadcast(intent);
}
});
}
void loadCategory(){
categories.clear();
adapterCategories = new AdapterCategories(getActivity(),categories,R.layout.row_category_item);
rcCategories.setLayoutManager(new GridLayoutManager(getActivity(),2));
rcCategories.setHasFixedSize(true);
rcCategories.setAdapter(adapterCategories);
adapterCategories.setOnItemClickListener(new AdapterCategories.OnItemClickListener() {
@Override
public void onItemClick(View view,int position) {
mListener.goToTrackInCategory(categories.get(position).getId(),categories.get(position).getTitle());
}
});
Call<ArrayList<Categories>> call= apiServices.getCategories(0,4,null);
call.enqueue(new Callback<ArrayList<Categories>>() {
@Override
public void onResponse(Call<ArrayList<Categories>> call,Response<ArrayList<Categories>> response) {
for (Categories category:response.body()
) {
categories.add(category);
}
adapterCategories.notifyDataSetChanged();
}
@Override
public void onFailure(Call<ArrayList<Categories>> call,Throwable t) {
}
});
}
错误
E/AndroidRuntime: FATAL EXCEPTION: main
Process: lrandomdev.com.online.mp3player,PID: 11063
java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.Iterator java.util.ArrayList.iterator()' on a null object reference
at lrandomdev.com.online.mp3player.fragments.FragmentHome$8.onResponse(FragmentHome.java:194)
at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6694)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
我对FragmentHome.java这一行感到怀疑
void loadAlbums(){
albums.clear();
adapterAlbum=new AdapterAlbum(getActivity(),Response<ArrayList<Album>> response) {
for (Album album:response.body()
) {
albums.add(album);
}
adapterAlbum.notifyDataSetChanged();
}
解决方法
只需检查:
-
调用或响应对象不为空。
-
在调用或响应中ArrayList的引用为空。
-
用于响应Arraylist中的空引用。
public void onResponse(Call<ArrayList<Album>> call,Response<ArrayList<Album>> response) { for (Album album:response.body() ) { albums.add(album); } adapterAlbum.notifyDataSetChanged(); }