<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 }