【达内课程】音乐播放器4.0(利用框架volley和gson展示列表)

如何学习框架?

1、可以各种baidu,查询实现这个需求市面上都用了什么框架(技术选型)
2、必须了解每个框架的基本功能与用法
volley:Google 开发的用于简化网络操作的库
gson:Google 开发的用于解析 json 的库
xutils:用于简化互联网、图片加载、数据库操作等

本节我们来实现用 volley 和 gson 来实现展示音乐列表,这里需要提前知道的知识有:

Volley 联网框架:
1、创建 RequestQueue 请求队列
2、创建 StringRequest 请求对象
3、把请求对象添加到请求队列中
4、添加联网权限

关于 volley 和 gson 的使用不做过多说明,看这两篇文章即可:
Android Volley使用(一)Volley的基本用法

使用Gson进行反序列化

加入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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值