文章目录
如何学习框架?
1、可以各种baidu,查询实现这个需求市面上都用了什么框架(技术选型)
2、必须了解每个框架的基本功能与用法
volley:Google 开发的用于简化网络操作的库
gson:Google 开发的用于解析 json 的库
xutils:用于简化互联网、图片加载、数据库操作等
本节我们来实现用 volley 和 gson 来实现展示音乐列表,这里需要提前知道的知识有:
Volley 联网框架:
1、创建 RequestQueue 请求队列
2、创建 StringRequest 请求对象
3、把请求对象添加到请求队列中
4、添加联网权限
关于 volley 和 gson 的使用不做过多说明,看这两篇文章即可:
Android Volley使用(一)Volley的基本用法
加入Volley、Gson
build.gradle 加入依赖
implementation 'com.android.volley:volley:1.2.1'
implementation 'com.google.code.gson:gson:2.8.5'
NewMusicListFragment
public class NewMusicListFragment extends Fragment {
......
private RequestQueue mQueue;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_music_list, null);
setViews(view);
setListeners();
mQueue = Volley.newRequestQueue(getActivity());
StringRequest stringRequest = new StringRequest(UrlFactory.getNewMusicListUrl("许嵩"),
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Gson gson = new Gson();
Music music = gson.fromJson(response, Music.class);
//更新Adapter
musics = music.data.song.songs;
setAdapter(musics);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});
mQueue.add(stringRequest);
/*model.loadNewMusicList("许嵩", new MusicCallback() {
@Override
public void onMusicListLoaded(List<MusicItem> list) {
//更新Adapter
musics = list;
setAdapter(list);
}
});*/
return view;
}
......
}
可以看到我们把之前 MusicModel 请求音乐列表注释掉了,换成了 Volley 的请求。在请求成功的回调里,用 Gson 解析了 json 数据。这一切都变的非常简单了
因为返回的数据结构如下:
所以 Music 是和上面返回的结构完全相同的 bean
public class Music {
public int code;
public MusicDataModel data;
}
public class MusicDataModel {
public MusicSongModel song;
}
public class MusicSongModel {
public List<MusicItem> songs;
}
public class MusicItem {
public String id;
public String name;
public String albumName;
public String albumPic;
public String url;
public AlbumModel al;
public HashMap<String,String> lrc;
}
public class AlbumModel {
public String name;
public String picUrl;
}
MusicAdapter 中给控件赋值的部分就可以写成:
//给控件赋值
MusicItem music = getItem(i);
holder.tvName.setText(music.name);
holder.tvAlbum.setText(music.al.name);
//图片在服务器,本来该起线程显示的,但是,这是adapter.getView()方法
//每次图片显示时,都要启线程的话,手机会炸的...
//给holder.imgPic设置图片
imageLoader.displayImage(music.al.picUrl, holder.imgPic);
return view;
如果学习了使用Volley加载网络图片,那么我们可以修改 MusicAdapter
/**
* 音乐列表适配器
*/
public class MusicAdapter extends BaseAdapter {
......
private ImageLoader imageLoader;
private HashMap<String, SoftReference<Bitmap>> cache = new HashMap<>();
public MusicAdapter(Context context, List<MusicItem> musics, ListView listView, RequestQueue requestQueue) {
super(context, musics);
this.context = context;
this.musics = musics;
this.inflater = LayoutInflater.from(context);
this.imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() {
@Override
public Bitmap getBitmap(String url) {
SoftReference<Bitmap> ref = cache.get(url);
if(ref != null){
return ref.get();
}
return null;
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
cache.put(url,new SoftReference<Bitmap>(bitmap));
}
});
}
......
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
......
//给holder.imgPic设置图片
ImageLoader.ImageListener listener = ImageLoader.getImageListener(holder.imgPic,R.mipmap.ic_launcher,R.mipmap.ic_launcher_round);
imageLoader.get(music.al.picUrl,listener);
return view;
}
class ViewHolder {
ImageView imgPic;
TextView tvName;
TextView tvAlbum;
}
}
Activity 中修改 初始化 MusicAdapter 的代码,同时删除 onDestroy() 方法
public void setAdapter(List<MusicItem> musics) {
adapter = new MusicAdapter(getActivity(), musics, listView,mQueue);
listView.setAdapter(adapter);
}