重新做一个简单的小项目,在一年后,争取进入android技术开发的行列中。
至于一直未能加入技术开发行业的原因,本博客将会进行展开,其实也是总所周知的原因。
本篇文章其实挺突然的,从笔记就突然变成了一篇分享出来的博客,记录自己的“重学成长”。
引言
从音乐播放器开始做起。Why MusicPlayer?
其中涉及列表展示,多线程,媒体等等,以及一年前自己开始写了一个较为大而全的项目,其中就有音乐播放器的功能[1]。
本文为第一部分,仅列出将本地音乐显示在列表里的基本步骤,以及把业务逻辑写在fragment中的一些坑。
后续在本文的知识点中,会增加相应链接,跳转到我的笔记[2]中。
所需知识点
Java:javaBean类、遍历(主要为while循环)、泛型、集合(List<>)
Android:
列表:ListView或RecycleView及生成:Adapter、ViewHolder
媒体:ContentProvider、ContentReserver、MediaStore
开始编写
界面
- 使用ListView或RecycleView编写基本列表
- 编写音乐播放控制条(上一曲下一曲)
- 编写音乐条目的
单个item
主要业务逻辑
注:findViewById相关步骤省略,若音乐的界面写在fragment内,前面需要getView()
[3]。
基本步骤
加入权限
AndroidManiFest.xml中加入读写权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Bean
编写MusicBean类,(根据单个item
中包含的内容为参考),生成getter与setter方法与构造方法,作为List的泛型对象存在被传入
数据源
初始化数据源:MusicBean
List<MusicBean> = new arrayList()
Adapter相关
编写适配器:
-
创建Adapter对象继承自Adapter(根据使用的列表而定)、
-
创建ViewHolder类继承自ViewHolder(根据使用的列表而定)
-
并重写三个方法并设置适配器:
3.1. 在ViewHolder里使用itemView与绑定ID对控件进行查找
3.2. 定义Context与List数据源,并使用构造函数传递(为什么?)
public class LocalMusicAdapter extends RecyclerView.Adapter<LocalMusicAdapter.LocalMusicViewHolder> {
Context context;
List<LocalMusicBean> musicDataBean;
public LocalMusicAdapter(Context context, List<LocalMusicBean> musicDataBean) {
this.context = context;
this.musicDataBean = musicDataBean;
}
3.3 创建Adapter对象继承自Adapter:泛型中传入ViewHolder,重写三个方法:
public LocalMusicViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//创建ViewHolder(对象)并返回,作用:生成与初始化每一个ViewHolder
View view = LayoutInflater.from(context).inflate(R.layout.item_music,parent,false);
LocalMusicViewHolder holder = new LocalMusicViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull LocalMusicViewHolder holder, int position) {
//查找并绑定数据展示
LocalMusicBean musicBean = musicDataBean.get(position); //拿到Bean
holder.songName.setText(musicBean.getSongName());
holder.artistName.setText(musicBean.getArtistName());
holder.albumName.setText(musicBean.getAlbumName());
}
@Override
public int getItemCount() { //有多少条目就返回多少条目
return musicDataBean.size();
}
布局管理器
创建布局管理器,设置为何种布局(横向滑动/瀑布流等),使用LinearLayoutManager
并设置
加载文件
使用ContentResolver-获取本地音乐URL地址
使用Cursor(游标)进行查询(resolver.query()
方法),之后进行遍历
TODO:Fragment的坑
如果将业务逻辑以Fragment的形式写在App项目中:
需考虑应用使用何种导航形式:侧滑菜单/底部Tab/ViewPager+Fragment,以及不同的展现方法。
确定好应用结构之后:
TODO:将fragment放进MainActivty.java
中。
直接写Context报错
fragment中无法直接调用findViewById与Context。(为什么?)
TODO:什么是context?他在App中开发的作用?
localMusicAdapter = new LocalMusicAdapter(getContext(),musicDataBean);
mRecycleView.setAdapter(localMusicAdapter);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext(),LinearLayoutManager.VERTICAL,false);
mRecycleView.setLayoutManager(linearLayoutManager);