1.二级列表
①创建适配器,找控件
②获取数据,死数据网络数据
③创建适配器
④设置适配器
⑤父项,子项点击事件
⑥基本属性
2.listview手动加载更多
①创建适配器,找控件
②获取数据,网络数据
③创建适配器
④设置适配器
⑤给listview添加一个footer
⑥点击footer中的bottom加载更多-page++,获取数据
3.listview自动加载更多
①创建适配器,找控件
②获取数据,网络数据
③创建适配器
④设置适配器
⑤定义一个变量isbottom表示是否滑倒底部
⑥listview设置滑动监听
3.侧滑菜单
①添加依赖
②创建布局DrawerLayout,NavigationView
③设置ActionBar 在style中修改属性为NoActionBar,toolbar设置logo,标题,副标题,关联toolbar和侧滑菜单
④监听事件,侧滑头部监听,侧滑菜单监听
⑤沉浸式状态栏,首先DrawerLayout引入属性然后在res下创建文件values-v21,文件内提娜佳文件styles.xml,添加属性
4.选项菜单
①创建选项菜单(代码,menu)showAction显示在toolbar
2.选项菜单的点击事件 onOptionsltemSelected Switch选择
5.上下文菜单
①注册上下文菜单 registerForContextMenu()
②创建上下文菜单 onCreateContextMenu
③上下文菜单的点击事件 onContextItemSelected
选项菜单和上下文菜单的区别:选项菜单是整个页面公用,上下文菜单是注册给某个组件,此组件拥有菜单,没有注册的组件没有此菜单。
__
6.recycleview基本使用
①添加依赖
②创建布局
③找控件
④设置布局管理器(三种显示方式:线性布局,网格布局,瀑布流布局)
⑤创建适配器--重写三个,通过接口回调实现点击事件
⑥设置适配器
7.recycleview多布局:list+banner
①recycleview基本使用
②定义类型变量
③重写方法getitemviewtype()根据位置返回不同类型的布局
④重写onbindviewHolder()根据不同的类型加载不同数据
⑤重写oncreateviewholder根据不同类型加载不同布局
注意:
1.获取条目总数:list.size()+1
2.onBindViewHolder:获取下标条目数据时,position+1
8.RecycleView通过接口回调实现点击事件
①在adapter定义一个内部接口,内部定义一个方法,方法参数时我们需要返回值的
②在adapter定义接口变量,并设置set方法
③在onBindViewHolder()中,给条目做一个点击事件
④在fragment或者activity中,使用adapter对象调用点击事件即可
9.RecycleView添加刷新
①添加依赖
②在布局中添加刷新的控件并找控件
③给刷新控件添加加载更多,下拉刷新添加监听
④刷新完毕关闭头和脚
10.静态添加fragment
①创建一个fragment
②创建布局,把①中的fragment放到布局中
注意:①fragment必须有ID
②布局中必须添加一个属性name,值是该fragment全类名
11.动态添加fragment
①获取碎片管理器
FragmentMsnager fm =getSupportFragmentManager()
②开启事务
FragmentTransaction fragmentTransaction =fm.beginTransaction()
③获取fragment对象
Afragment afragment =new Afragment()
④替换容器中内容
fragmenttransaction.replace(R.id.fl,Afragment)
⑤提交事务
fragmenttransaction.commit()
12.Transaction常用方法
①add
②remove
③replace
④hide
⑤show
⑥attach
⑦detach
⑧commit
13.fragment生命周期
①onattach()
②oncreate()
③oncreateview()
④onactivitycreated()
⑤onstart()
⑥onresume()
⑦onpause()
⑧onstop()
⑨ondestroyview()
⑩ondestroy()
⑪ondetach()
14.fragment传递数据到activity
①获取activity对象,直接调用方法
mainactivity activity = (mainactivity)getactivity
②接口回调传递数据
③通过fragment的有参构造传递数据
15.activity传递数据到fragment
①通过bundle方式传
activity中
afragment afragment =new afragment()
bundle bundle =new bundle()
bundle.putstring(a,我是来自activity的数据)
afragment.setargumets(bundle)
fragment中
bundle bundle=getarguments()
string s = bundle.geystring(a)
16.fragment与fragment之间传递数据
①通过构造方式传值(不推荐)
②通过fragmentmanager找到对应ID或者fragment,然后获取里面的数据或方法
③通过它们所在的activity作为桥梁,可以使用getactivity()或者接口回调,达到获取另一个fragment数据的目的
五.viewpager+tablayout
1.viewpager结合view实现导航
①创建布局 找控件
②获取数据集合
③创建适配器
getcount()
isviewfromobject()
instantiateltem()
destroyitem()
④设置适配器
2.viewpager结合fragment实现导航
①创建布局找控件
②获取fragment集合中的fragments
③创建适配器
④设置适配器
3.banner开源框架
banner.setbannerstyle(BannerConfig.NUM_INDICATOR_TOTLE)(设置风格)
.setimages(images)(设置图片集合)
.setbanneranimation(Transformer.DepthPage)(设置动画)
.setBannerTitle(titles)(直接添加无效,必须设置bannerstyle)
.setImageLoader(new GrildeImageLoader)(图片加载器)
.start()
4.tablayout
①属性
5.TVF
①创建布局找控件
②创建两个集合fragments和titles
③创建适配器四个方法一个构造
④设置适配器
⑤TV结合tab.setupwithviewpage(vp)
⑥设置图片选择器seticon
6.TVF涉及的懒加载
六.popupWindow
//创建布局
View inflate = LayoutInflater.from(this).inflate(R.layout.pop,null);
//new一个popupwindow
PopupWindow popupWindow =new PopupWindow(inflate, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
//让edtext可以输入内容
popupWindow.setFocusable(true);
//点击外面popwindow消失
popupWindow.setOutsideTouchable(true);
//设置全局阴影
popupWindow.setBackgroundDrawable(new ColorDrawable());
//设置
background(0.5f);
//让popwindow显示在按钮下面
popupWindow.showAsDropDown(mBtn,20,20);
//设置
popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
background(1f);
}
});
}
private void background(float v) {
Window window = getWindow();
WindowManager.LayoutParams attributes = window.getAttributes();
attributes.alpha = v ;
window.setAttributes(attributes);
}
七.notification
①//创建管理器
NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
②//兼容O类型
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
NotificationChannel channel =new NotificationChannel(channerid, channername, NotificationManager.IMPORTANCE_DEFAULT);
③延时意图
Intent intent =new Intent(this, Main2Activity.class);
PendingIntent activity = PendingIntent.getActivity(this,100, intent, PendingIntent.FLAG_CANCEL_CURRENT);
④//创建通知对象
Notification notification =new NotificationCompat.Builder(this,channerid)
//设置图片
.setSmallIcon(R.mipmap.ic_launcher_round)
//设置标题
.setContentTitle("通知来了")
//设置内容
.setContentText("我是内容")
//延时意图
.setContentIntent(activity)
.build();
⑤//f发送通知
nm.notify(10,notification);
八.权限
1.权限分类分为普通权限(不需要动态获取)和危险权限(需要动态获取)
2.危险权限分类:3CSLMP
相机,联系人,日历,传感器,短信,存储,位置,麦克风,电话
3.如何获取动态权限?
①在清单列表上写上需要的权限
②检查是否授权 若授权——》操作
若未授权——》请求权限
③请求权限结果
九.内容提供者
①创建一个数据库和一张表
自定义ContentProvider继承ContentProvider,重写方法
②ContentResolver
获取ContentResolver
获取uri:Uri.parse(content://"+authorities+/+path)
十.ContentResolver读取短信.通讯录.图片.音频.视频
①动态获取危险权限
②获取ContentResolver对象ContentResolver
③contentResolver调用query()方法查询相关内容
短信:Telephony.Sms.CONTENT_URI
通讯录:ContactsContract.CommonDataKinds.Phone.CONTENT_URI
图片:MediaStore.Images.Media.EXTERNAL_CONTENT_URI
音频:MediaStore.Audio.Media.ENTERNAL_CONTENT_URI
视频:MediaStpre.Video.Media.ENTERNAL_CONTENT_URI
十一.Service
1.service概述,应用场景
2.startService生命周期
oncreate()-onstartcommand()-ondestory()
3.bindService生命周期
oncreate()-onbind()-onunbind()-ondestory()
4.Activity和Service之间的数据传递
①数据从activity和到service
intent方式:startservice和bindservice都可以
②数据从activity和到service
ibinder方式:bindservice
③数据从service到activity
接口回调和广播
十二.音乐播放器
1.MediaPlayer创建方式
①可以直接使用new的方式
MediaPlayer mp = new MediaPlayer();
②使用create的方式
MediaPlayer mp = MediaPlayer.create(this,R.raw.test)
2.四种资源
①用户在应用中自带的resource资源
②存储在sd卡或者其他文件路径下的媒体文件
③网络上的媒体文件
④assets目录下的文件
3.assets和raw资源文件夹的区别:
res/raw不可以有目录,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹
4.结合SeekBar实现拖动播放音乐功能
(1)创建seekbar的布局
(2.)seekbar设置监听,在停止监听中:int progress = seekBar.getProgress();mp.seekTo(progress);
(3)更新seekbarprivate void updataSeekBar() {new Thread(new Runnable() {@Override public void run() {while (mp.isPlaying()) {try {Thread.sleep(1000);mSb.setMax(mp.getDuration());mSb.setProgress(mp.getCurrentPosition());}catch (InterruptedException e) {e.printStackTrace();}}}}).start();}
5.结合Recycler实现音乐播放上一首下一首(1.)使用ContentResolver+RecyclerView展示音乐列表
(2.)条目点击事件播放对应的音乐
(3)点击上一首下一首case R.id.bt_pe:if(position>0){position--;}else{position=list.size()-1;}play();break;case R.id.bt_next:if(positionposition++;}else{position=0;}play();break;
6.结合service实现后台播放功能
①创建一个服务audioservice
②服务中创建内部类audiobinder,类中有一个方法返回服务类型
③在oncreate()初始化medioplayer对象
④创建一系列关于mp的方法,播放暂停继续停止拖动
⑤在audioactivity中绑定服务,返回服务类对象
⑥按钮点击事件,通过服务对象调用其中的方法实现音频播放
⑦seekbar监听setonseekbarchanged进度改变监听,把进度传给mp