欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发过程中的坑及解决方法收录(四)

程序员文章站 2022-10-24 12:11:38
1.某个控件要放在Linearlayout布局的底部(底部导航条) ...//嵌套的其他布局…… ...//嵌套的其他布局 简单说明一下,上面的代码中有一个Linearlayout,里面嵌套了两个Linearlayout 这里的关键是嵌套里面的第一个 布局,注意这个布局里面的这两行属性代码 第二个L ......

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滑动的过程中同时加载网络的图片,所以卡顿。

我们实现滑动的时候不加载网络图片,当不滑动的时候再加载网络图片,这样流畅度就可以提高许多

  1. recyclerviewadapter(自己写的)中添加一个判断recyclerview是否滑动的boolean变量isscrolling

     protected boolean isscrolling = false;
    
     public void setscrolling(boolean scrolling) {
         isscrolling = scrolling;
     }
  2. 之后在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);
         }
    
     }
  3. 在相应的activity中调用recyclerviewaddonscrolllistener方法,设置一个滑动监听器

      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即可,然后设置recyclerviewnestedscrollingenabled属性为false

两种方法设置recyclerviewnestedscrollingenabled属性

- 调用`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数据更新

调用adapternotifydatasetchanged方法即可

使用需要注意的是,list必须是同一个对象,调用list.addall方法即可把另外一个同类list里面的全部数据存放进去