<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,里面嵌套了两个Linearlayoutandroid
这里的关键是嵌套里面的第一个Linearlayout
布局,注意这个布局里面的这两行属性代码json
`android:layout_height="0dp"` `android:Layout_weight="2"`
第二个Linearlayout就是能够放在底部的一个Linearlayout(固然你能够写你本身的布局)缓存
思路:图片太多,显示卡顿的缘由主要是由于在RecyclerView滑动的过程当中同时加载网络的图片,因此卡顿。网络
咱们实现滑动的时候不加载网络图片,当不滑动的时候再加载网络图片,这样流畅度就能够提升许多app
在RecyclerView
的Adapter(本身写的)
中添加一个判断RecyclerView
是否滑动的boolean变量isScrolling
框架
protected boolean isScrolling = false; public void setScrolling(boolean scrolling) { isScrolling = scrolling; }
以后在Adapter
里面的onBindViewHolder
方法控制加载图片ide
@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); } });
这里使用NestedScrollView
便可,而后设置RecyclerView
的NestedScrollingEnabled
属性为false
gradle
两种方法设置RecyclerView
的NestedScrollingEnabled
属性优化
- 调用`RecyclerView`的`setNestedScrollingEnabled`方法 - 在xml文件里面,把`RecyclerView`直接设置为`flase`
给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()){ //相关提示 //相关操做 //下拉刷新,数据更新操做 //... } } });
看了资料,好像是respone.body().string()
只能调用一次,还有okhttp是有缓存的
使用的情景:有一个API接口,每次访问改接口,都会返回不一样的json数据,可是使用okhttp,每次访问该API返回的数据都是相同
个人解决方法:
给API请求时添加参数,有些API是能够带参数的,能够修改参数,达到是不一样网址的效果
调用Adapter
的notifyDataSetChanged
方法便可
使用须要注意的是,List必须是同一个对象,调用List.addAll方法便可把另一个同类List里面的所有数据存放进去
问题:打开APP,添加数据,没有如何问题,可是,继续添加则会将以前的数据覆盖,不能实现新的添加
缘由是由于使用了static,新添加的对象是和以前是使用的同一个内存地址,因此添加新的数据会覆盖以前添加的数据
解决方法:new一个新的数据对象便可解决问题
Can't process attribute android:fillColor="@color/colorAccent"
解决方法 :在gradle文件android下添加。
defaultConfig { vectorDrawables.useSupportLibrary = true }