項目實戰:新聞APPday04學習筆記
不否認努力,繼續加油!
學習整理重點、盲區,筆記如下:乾乾巴巴,麻麻賴賴,一點都不圓潤……
day04
內容
1. 頂部新聞輪播圖事件處理
-
自定義類 HorizontalScrollViewPager 要求父類不攔截事件;
a. 存在的 BUG;選中第一個選項卡;而頂部 ViewPager 的新聞輪播圖不在首頁時;此時向右滑動,理論應該滑動的是頂部 ViewPager 的新聞;而實際上確實抽出了菜單;
b.自定義 HorizontalScrollViewPager
//在 dispatchTouchEvent() 中請求父層視圖不攔截,當前控件的事件 getParent().requestDisallowInterceptTouchEvent(true);
c. 新的BUG;攔截後,頂部 ViewPager 的新聞輪播圖滑在尾頁時,也不能滑動;此時要對事件進行處理;
-
處理滑動事件;讓父親控件不攔截當前控件的事件;
a.上下拖動時,父元素可以攔截當前事件;
b.左右拖動時,不可用攔截事件;
c.如果當前ViewPager是第0頁面並且是從左向右滑動,攔截;
d.如果當前ViewPager是最後頁面並且是從右向右滑左,攔截;
2. 自定義下拉刷新(touch事件處理)
-
自定義類RefreshListView和佈局文件
a. 自定義類RefreshListView繼承ListView;
並在初始化視圖時,將下拉刷新的“頭”視圖添加到頭上;this.addHeaderView(headerView);
b. 自定義下拉刷新的“頭”視圖的佈局
c. 自定義ProgressBar樣式
android:innerRadiusRatio="2.5"
Float類型。這個值表示內部環的比例,例如,如果android:innerRadiusRatio = " 5 ",那麼內部的半徑等於環的寬度除以5。這個值會被android:innerRadius重寫。 默認值是9。值越大,圓的寬越小。當時1的時候看不到。android:thicknessRatio="15"
Float類型。厚度的比例。例如,如果android:thicknessRatio= " 2 ",
然後厚度等於環的寬度除以2。這個值是被android:innerRadius重寫, 默認值是3。值越大,圓環的環越小。android:useLevel="false" ,
當值設置爲true的時候出錯隱藏和再次顯示。Boolean類型。如果用在 LevelListDrawable裏,那麼就是true。如果通常不出現則爲false。<?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="0" android:pivotX="50%" android:pivotY="50%" android:toDegrees="360" > <shape xmlns:android="http://schemas.android.com/apk/res/android" android:innerRadiusRatio="2.5" android:shape="ring" android:thicknessRatio="15" android:useLevel="false" > <gradient android:centerColor="#33ff0000" android:endColor="#ff0000" android:startColor="#ffffff" android:type="sweep" /> </shape> </rotate>
d. 隱藏頭部
這裏首先是必須要測量;不測量無法獲得自定義 “頭” 文件的高;
其次,參數傳0,0沒有特殊意義,毫無意義;
這裏用的是將 “頭” 佈局安裝在 負數;也就是不可見,而不是設置可視狀態;View.setPadding(0,-控件高,0,0);//完全隱藏;View.setPadding(0,0,0,0);//完全顯示;public void initHeaderView(Context context){ View headerView = View.inflate(context, R.layout.refresh_listview_header, null); //測量 headerView.measure(0, 0); //得到控件的高 int headerViewHeight = headerView.getMeasuredHeight(); //設置填充 headerView.setPadding(0, -headerViewHeight , 0, 0); this.addHeaderView(headerView); }
-
拖動實現隱藏和顯示頭部控件
a. 重寫onTouchEvent() 在down startY;
b. 計算滑動的距離
float distanceY = endY - startY;
int paddingTop = -控件高 + distanceY; View.setPadding(0,paddingTop,0,0);//動態的顯示下拉刷新控件c. 設置效果
在手指按下時;檢測是否向下拉動屏幕,檢測當前狀態:如果不是下拉刷新,就設置其狀態爲下拉刷新並更新 View,設置動畫;
響應的設置 釋放刷新;
在手指離開屏幕時,設置狀態和對應的畫面,設置會調接口;
3. 下拉刷新鬆開處理和接口的定義
-
刷新的效果的實現
-
下拉刷新鬆開處理和接口的定義
a. 定義下拉刷新接口;
b. 定義接口實現類;
c. 設置監聽並在監聽中設置請求數據的方法,並且更新時間;
4. 自定義ListView(加載更多)
-
添加加載更多佈局
a. 設置 “加載更多” 佈局xml文件;
b. 代碼中初始化,並設置默認隱藏;
View footerView = View.inflate(context, R.layout.refresh_listview_footer, null); //隱藏代碼 footerView.measure(0, 0); int footerViewHeight = footerView.getMeasuredHeight(); footerView.setPadding(0, -footerViewHeight, 0, 0); this.addFooterView(footerView);
-
拖動到底部的時候顯示加載更多佈局
a. 設置監聽,在 onScrollStateChanged() 中判斷,是否加載到最後一條數據;
b. 當加載到最後一條時,顯示 該視圖;並回調加載更多的方法;
-
判斷完整顯示輪播圖分析
a. 此時存在BUG:當列表在更多數據位置時,稍微向下滑動,就會直接返回到頂部進行刷新操作;
b. 解題思路:當頂部的輪播圖新聞頁完全顯示時,向下滑動才進行刷新操作;如果不能完全顯示輪播圖,就執行 ListView 的向上滾動;
-
判斷輪播圖是否完全顯示
a. 獲取 輪播圖 和 ListView 的Y座標,如果輪播圖的座標 ≥ 對方的Y座標時,才進行刷新操作;
b. 如果不是完全顯示時,在滑動時直接 break;而不進行刷新操作;
c. 誤以爲是事件衝突,其實不是;
5. 把下拉刷新抽取成第三方庫並且使用
- 新建 module;
- 把代碼、佈局等文件添加進來;
- 依賴並使用;
- 寫一個案例,方便其他用戶理解使用
6. PullToRefresh下拉刷新的使用
-
PullToRefresh簡介
PullToRefresh是一套實現下拉刷新庫,它支持:1. ListView;2.ExpandableListView;3. GridView;4.WebView;5. ScrollView;6. HorizontalScrollView;7. ViewPager
-
PullToRefresh集成
a. 關聯庫PullToRefresh庫
b.把新聞詳情頁面的代碼拷貝到專題詳情頁面
c.把TabDetailPager代碼複製重新創建新類TopicTabDetailPager
d.佈局文件新增加topic_tab_detailpager.xml,並引用案例中需要的佈局;
e. 實例化,並在 initView 方法中設置監聽和添加頭部
f. 設置回調完成等
盲區
- 本博客根據尚硅谷項目實戰: 北京新聞.學習整理;
其他筆記
新聞APP其他筆記
- day01
第一天的學習筆記: 新聞APP01. - day02
第二天的學習筆記: 新聞APP02. - day03
第三天的學習筆記: 新聞APP03. - day04
第四天的學習筆記: 新聞APP04. - day05
第五天的學習筆記: 新聞APP05. - day06
第六天的學習筆記:新聞APP06. - day07
第七天的學習筆記:新聞APP07.
購物商城APP學習筆記
購物商城APP學習筆記:購物商城