DataBinding


  • DataBindingHelper.jar的使用:作为插件导入后,和​​GsonFormat​​的使用类似。在对应的​​Bean​​里,可自动生成​​@Bindable​​和​​notifyPropertyChanged(BR.title);​​。此杰作是同事做的。网上也有类似的插件可以使用。
  • 神坑!windows下databinding引入文字会有问题,而mac上没有!使用@string/string_type引入字符串!


  • ​layout​​节点写了​​xmlns:android="http://schemas.android.com/apk/res/android​​后,子布局不能写.
  • include 子布局时子布局根节点也要声明id,不然引用不到子布局id
  • databinding 绑定子布局。先绑定,后父布局再​​addView()​
  • 注入 databinding 后,AndriodStudio包结构变乱。解决:Android Studio2.2会出现此情况,升级到2.2.2就可以了。
  • databinding绑定​​bean​​时,里面的子类也需要继承​​BaseObservable​​,否则会报错。
  • recyclerview 的viewhodler 里,获得绑定 view 的databinding:​​DataBindingUtil.getBinding(this.itemView);​​。
  • 布局里没有声明​​id​​,则对应的 ItemEverydayBinding 无法生成。
  • 更改包名之后(rename – gradle.applicationId), databinding 相关文件会报错,进入​​Build --> Build Project​​就好了!
  • 注意:引用如:android:showImg=’@{bean.images.large}’时,里面的​​bean​​写错会造成编译错误!
  • 注意:​​text='@{xx}'​​里面的值应为​​String​​类型。引用方法里的参数类型应一致。报错是不告诉具体的哪行代码,写多了只能自己一个个地方找。
  • android:showImg=’@{bean.images.large}’这样设置图片会闪一下!尤其是在recyclerview里面,效果很不好,如果是写在 adapter里就好了:ImgLoadUtil.displayEspImage(bean.getImages().getLarge(), binding.ivTopPhoto, 0);。不仅仅图片,文字也会闪。加上这句就好了:​​binding.executePendingBindings();​​,意思是:当数据改变时,binding会在下一帧去改变数据,如果我们需要立即改变,就去调用executePendingBindings方法。
  • 布局里面的子布局里引用的bean可以一样(type一样),但是最好name不一样,不然可能会导致​​setBean()​​无效。改变name名就好了。
  • ​<variable name="subjectsBean" type="com.example.jingbin.bean.moviechild.SubjectsBean" />​
  • <import type="com.example.yunyue.utils.StringFormatUtil"/>
    // 布局调用
    android:text="@{StringFormatUtil.formatName(subjectsBean.directors)}"
  • android:text='@{"类型:"+StringFormatUtil.formatGenres(subjectsBean.genres)}'
  • // 任意类里声明
    @BindingAdapter("android:showImgBg")
    public static void showImgBg(ImageView imageView,String url) {
    displayGaussian(imageView.getContext(),url,imageView);
    }
    // 布局调用
    android:showImgBg='@{subjectsBean.images.large}'

使用​​@BindingAdapter()​​,自定义loader用来异步载入图像:

  • 一个参数时:

  • 两个或多个参数时:
    ​/** * 妹子,电影列表图 * @param defaultPicType 妹子:1 电影:0 */ @BindingAdapter({"android:displayFadeImage","android:defaultPicType"}) public static void displayFadeImage(ImageView imageView, String url,int defaultPicType) { displayEspImage(url, imageView, defaultPicType); } // XML里使用: android:defaultPicType="@{1}" android:displayFadeImage="@{bean.url}" ​


注意:


  • 1. 方法参数第一个是控件声明,放在第二位不可以!
  • 2. 布局调用时,命名空间可自动生成。

建议:


  • 1.​android:showImgBg​​可任意写,但是项目里不能出现相同的命名,否则会被后来的覆盖掉!
  • 2. 如果 imgload:showImgBg 这样写,第一次编译会提示找不到该命名空间,跳到声明处。建议写成 android:showImgBg。


  1. 三元运算法:
    ​导入:<import type="android.text.TextUtils" /> 使用:android:text='@{TextUtils.isEmpty(resultsBean.who)?"佚名":resultsBean.who}' 也可以直接使用这时返回为null会不显示。​

RecyclerView



✔️ ​​NestedScrollView​​里嵌套 RecyclerView 官方后期已经解决了显示不全问题!看引用的包是什么版本的!还需要加上这两行代码:(这样不推荐,会把内容全部一次性的加载进内存,造成卡顿)

recyclerView.setNestedScrollingEnabled(false);
recyclerView.setHasFixedSize(false);


❌ NestedScrollView里嵌套 RecyclerView ,在​​recyclerView.setLayoutManager(new FullyLinearLayoutManager(getActivity()));​​之后,需要加上,不然滑动不流畅:

recyclerView.setNestedScrollingEnabled(false);
recyclerView.setHasFixedSize(false);

以上切换还是会卡顿,原因是角标越界,虽然​​try​​了,还是会卡。使用​​MyScrollView​​也不可以。显示不全!​​FullyLinearLayoutManager& MyScrollView​



RecyclerView 的item显示出现控件显示不全,item只显示一部分,非常怪异!在adapter中的onCreateViewHolder()中
​View inflate = layoutInflater.inflate(R.layout.xxx, parent, false);​​注意要依附于parent。这样就好了!


  • RecyclerView: No adapter attached; skipping layout 没有数据时,​​gone​​掉,不然一直会提示这个!
  • ​addFooterView​​时,使用LinearLayout 包裹时会显示部分,改为RelativeLayout或FrameLayout正常。

  • ​NestedScrollView​​包裹​​RecyclerView​​如果没关联下面design包会显示不出,加了就好了!


compile 'com.android.support:design:24.2.1'

同时此包里还含有​​Toolbar​​的属性:

app:layout_collapseMode="pin"
app:layout_scrollFlags="enterAlways|scroll"

  • NestedScrollView里嵌套 RecyclerView 需要在​​onResume​​里加上​​.setFocusable(false)​​,不然进入页面会定位到列表第一条或其他问题。
  • 添加​​headerview​​后,隐藏显示,进度条不会到达屏幕顶端。



ViewPager 与 Fragment


  • 父布局使用​​fragment​​或​​scrollview​​下拉会有阴影效果。
  • viewpager左右预加载页面的个数设置:​​setOffscreenPageLimit(3);​​,设置后保证页面不被销毁,切换时就不会卡顿了(显示时加载数据)。注意,如果是这个viewpager本身就在父一个viewpager的一个页面里,则设置adapter时,应传​​getChildFragmentManager()​​,不然以上会设置不上,非法状态异常!
  • Fragment 和当前自身所在的Activity 走一套生命周期,意思就是​​Activity​​走了​​onResume()​​,​​fragment​​才会走自身的​​onResume()​​,多个Fragment 相互切换是不走onResume()和onDestroy()的。
  • 如果listview 里​​addHeaderView()​​添加轮播图,则轮播图滚动时会调用 listview 的滚动监听,且返回的​​firstVisiblePosition = 0​​。
  • Activity 里放多个fragment,当加载过其中一个​​fragment A​​后,切到其他的fragment,直至销毁fragment A后,再直接切到fragment A,这时​​fragmentA.getUserVisibleHint() = false​​。所以依赖getUserVisibleHint() = true的逻辑要注意了!最好的方式是在 viewpager 的监听里,手动​​fragment.setUserVisibleHint(true)​​。
  • 根据​​setUserVisibleHint()​​方法的调用时间,来实现 fragment 的懒加载。setUserVisibleHint() 会在​​onActivityCreated()​​之前调用,所以可以在onActivityCreated() 进行一系列初始化的操作,然后在 setUserVisibleHint() 里请求数据。具体请见​​这里​​。

Retrofit


  • 使用​​retrofit​​请求时,Bean里如有​​Drawable​​字段,而且没有赋值,会数据解析异常,出现​​StackOverflowError​​错误。
  • 使用​​retrofit​​请求时,若请求成功且有数据返回还报错,看​​Bean​​里字段或字段类型是否写错。
  • ​retrofit​​设置​​post​​请求时,传数组时使用​​image_ids[]​​​​@FormUrlEncoded @POST("/vip/diagnostic_explains") Observable<ErrorBean> postDiagnosticExplains(@Header("a") String a, @Field("userkey") String userkey, @Field("comment") String comment, @Field("image_ids[]") List<Integer> image_ids);​

ACache


  • 使用​​ACache​​工具缓存时,如果缓存的​​bean​​类名一致,或类里面的内部类一致,这时logcat会提示有两个相同bean的id,就是无效的类,或找不到该类。所以:缓存的文件里的类名最好不要一样!
  • 使用​​ACache​​工具缓存时,subList没有实现序列化!缓存​​List​​时会出错!​​详情​

TextView


  • 使​​TextView​​实现长按复制文本的功能,加上属性:​​android:textIsSelectable="true"​
  • ​textView​​中间加横线:​​textView .getPaint().setFlags(Paint. STRIKE_THRU_TEXT_FLAG );​

其他


  • 兼容5.0以下水波纹效果:新建drawable-21文件,里面放ripple文件,其他正常,​​详情​​。

  • ​listview​​某图标显示亮或不亮的问题:先全部不亮,再根据条件变亮。

  • 当ScrollView里的元素想填满ScrollView时,使用 fill_parent 是不管用的,必需为ScrollView设置:​​android:fillViewport="true"​​。

  • Android 5.1的SDK把​​Button​​的默认Style改了,使Button上显示因为全为大写,加上属性​​android:textAllCaps="false"​​就好了,​​详情​​。


​toolbar​​中设置标题和副标题文字颜色和大小时,在xml文件配置​​app:titleTextAppearance="@style/ToolBar.Title"​​可以,其中

<style name="ToolBar.Title" parent="@style/TextAppearance.Widget.AppCompat.Toolbar.Title">
<item name="android:textSize">18.0sp</item>
<item name="android:textColor">@color/colorWhite</item>
</style>

也可以在activity中设置:
​binding.titleToolBar.setTitleTextAppearance(this, R.style.ToolBar_Title);​


设置透明状态栏时,布局根节点不要设置​​android:fitsSystemWindows="true"​​否则状态栏会一直存在,被这个问题坑了一整天!!还有整块布局也不要给设置颜色。

​ImageView​​图片直接​​src​​会内存泄漏,图片宽高大时会很严重,建议代码设置。

1920*1080(1080p) 小米3,小米5等,属于xxhdpi,将图片放在这个文件夹内,这个分辨率的手机显示图片会很清晰,放在xhdpi清晰度会降低。

1.文字颜色选择器:里面的根节点应为​​color​​且最好放在新建​​color​​文件下。2.作为背景选择器来说,根节点应该是​​drawble​​,最好放在​​drawble​​文件夹下。

​Glide​​加载图片:自动缓存当前图片的尺寸,如果其他地方取这个比例的图片则取的是缓存。不缓存等比例的图片!如果其他地方想要取当前图片的缓存,可加载时设置当前图片的宽高,用这个方法:​​override(300,400)​​,值在​​dimens​​里取,直接设置会损失清晰度。