zoukankan      html  css  js  c++  java
  • 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滑动的过程中同时加载网络的图片,所以卡顿。

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

    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里面的全部数据存放进去

    6.litepal无法继续添加数据

    问题:打开APP,添加数据,没有如何问题,但是,继续添加则会将之前的数据覆盖,不能实现新的添加

    原因是因为使用了static,新添加的对象是和之前是使用的同一个内存地址,所以添加新的数据会覆盖之前添加的数据

    解决方法:new一个新的数据对象即可解决问题

    7. 图片xml文件无法引用color.xml中的属性

    Can't process attribute android:fillColor="@color/colorAccent"

    解决方法 :在gradle文件android下添加。

    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
    
  • 相关阅读:
    Beta 冲刺(4/7)
    Beta 冲刺(3/7)
    Beta 冲刺(2/7)
    Beta 冲刺(1/7)
    福大软工 · BETA 版冲刺前准备(团队) [已完成]
    解决Mac外接显示器分辨率不正确问题
    oracle11g客户端如何完全卸载(转)
    【转】VMware设置共享文件夹之后Ubuntu中看不到怎么办?
    解决无法将程序加到默认程序打开列表中的问题(转)
    设置无线上网和本地上网的优先级
  • 原文地址:https://www.cnblogs.com/stars-one/p/10088879.html
Copyright © 2011-2022 走看看