Android开发过程中的坑及解决方法收录(四)
1.某个控件要放在linearlayout布局的底部(底部导航条)
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:orientation="vertical" android:layout_height="match_parent" ...> <linearlayout android:layout_width="match_parent" android:orientation="vertical" android:layout_height="0dp" android:layout_weight="2"> ...//嵌套的其他布局…… </linearlayout> ...//嵌套的其他布局 <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content"> </linearlayout> </linearlayout>
简单说明一下,上面的代码中有一个linearlayout,里面嵌套了两个linearlayout
这里的关键是嵌套里面的第一个linearlayout
布局,注意这个布局里面的这两行属性代码
`android:layout_height="0dp"` `android:layout_weight="2"`
第二个linearlayout就是可以放在底部的一个linearlayout(当然你可以写你自己的布局)
2.recyclerview显示图片卡顿优化
思路:图片太多,显示卡顿的原因主要是因为在recyclerview滑动的过程中同时加载网络的图片,所以卡顿。
我们实现滑动的时候不加载网络图片,当不滑动的时候再加载网络图片,这样流畅度就可以提高许多
-
在
recyclerview
的adapter(自己写的)
中添加一个判断recyclerview
是否滑动的boolean变量isscrolling
protected boolean isscrolling = false; public void setscrolling(boolean scrolling) { isscrolling = scrolling; }
-
之后在
adapter
里面的onbindviewholder
方法控制加载图片@override public void onbindviewholder(viewholder holder, int position) { string url = mlist.get(position).getimg().geturl(); if (!isscrolling){ //我使用的是ion显示图片框架 //如果不在滑动,则加载网络图片 ion.with(holder.imageview.getcontext()) .load(url) .withbitmap() .placeholder(r.drawable.grey) .intoimageview(holder.imageview); }else { //如果在滑动,就先加载本地的资源图片 drawable temp = holder.imageview.getresources().getdrawable(r.drawable.grey, null); holder.imageview.setimagedrawable(temp); } }
-
在相应的
activity
中调用recyclerview
的addonscrolllistener
方法,设置一个滑动监听器mrv.addonscrolllistener(new recyclerview.onscrolllistener() { @override public void onscrollstatechanged(recyclerview recyclerview, int newstate) { if (newstate == recyclerview.scroll_state_idle) { // 滚动静止时才加载图片资源,极大提升流畅度 adapter.setscrolling(false); adapter.notifydatasetchanged(); // notify调用后onbindviewholder会响应调用 } else{ adapter.setscrolling(true); } super.onscrollstatechanged(recyclerview, newstate); } });
3.scrollview与recyclerview滑动冲突
这里使用nestedscrollview
即可,然后设置recyclerview
的nestedscrollingenabled
属性为false
两种方法设置recyclerview
的nestedscrollingenabled
属性
- 调用`recyclerview`的`setnestedscrollingenabled`方法 - 在xml文件里面,把`recyclerview`直接设置为`flase`
判断scrollview是否滑动到底部
给scrollview
添加一个滑动监听器,然后进行相关处理
mnestedsv.setonscrollchangelistener(new nestedscrollview.onscrollchangelistener() { @override public void onscrollchange(nestedscrollview v, int scrollx, int scrolly, int oldscrollx, int oldscrolly) { view view = mnestedsv.getchildat(0); if (mnestedsv.getheight()+mnestedsv.getscrolly() ==view.getheight()){ //相关提示 //相关操作 //下拉刷新,数据更新操作 //... } } });
4.使用okhttp返回数据相同解决方法
看了资料,好像是respone.body().string()
只能调用一次,还有okhttp是有缓存的
使用的情景:有一个api接口,每次访问改接口,都会返回不同的json数据,但是使用okhttp,每次访问该api返回的数据都是相同
我的解决方法:
给api请求时添加参数,有些api是可以带参数的,可以修改参数,达到是不同网址的效果
5.recyclerview数据更新
调用adapter
的notifydatasetchanged
方法即可
使用需要注意的是,list必须是同一个对象,调用list.addall方法即可把另外一个同类list里面的全部数据存放进去
推荐阅读
-
android开发环境遇到adt无法启动的问题分析及解决方法
-
Android开发过程中的坑及解决方法收录(四)
-
uniapp踩坑(四):android中引入高德地图,实时定位(精度)遇到的问题及解决方法
-
Android 8.0 的部分坑及对应解决方法
-
ionic开发的过程中遇到的问题及解决方法的整理(二)
-
Android 盒子开发过程中遇到的问题及解决方法
-
ionic开发的过程中遇到的问题及解决方法的整理(一)
-
ionic开发的过程中遇到的问题及解决方法的整理(三)
-
微信支付之扫码支付开发:小弟我遇到的坑及解决方法(附:Ecshop 微信支付插件)
-
Android开发过程中的坑及解决方法收录(四)