自定義下拉刷新 & 把自定義View抽取成庫— Android項目實戰—新聞APP04


不否認努力,繼續加油!
學習整理重點、盲區,筆記如下:乾乾巴巴,麻麻賴賴,一點都不圓潤……

day04

內容

1. 頂部新聞輪播圖事件處理

  1. 自定義類 HorizontalScrollViewPager 要求父類不攔截事件;

    a. 存在的 BUG;選中第一個選項卡;而頂部 ViewPager 的新聞輪播圖不在首頁時;此時向右滑動,理論應該滑動的是頂部 ViewPager 的新聞;而實際上確實抽出了菜單;

    b.自定義 HorizontalScrollViewPager

    //在 dispatchTouchEvent() 中請求父層視圖不攔截,當前控件的事件
    getParent().requestDisallowInterceptTouchEvent(true);
    

    c. 新的BUG;攔截後,頂部 ViewPager 的新聞輪播圖滑在尾頁時,也不能滑動;此時要對事件進行處理;

  2. 處理滑動事件;讓父親控件不攔截當前控件的事件;

    a.上下拖動時,父元素可以攔截當前事件;

    b.左右拖動時,不可用攔截事件;

    c.如果當前ViewPager是第0頁面並且是從左向右滑動,攔截;

    d.如果當前ViewPager是最後頁面並且是從右向右滑左,攔截;

2. 自定義下拉刷新(touch事件處理)

  1. 自定義類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);
    }
    
  2. 拖動實現隱藏和顯示頭部控件

    a. 重寫onTouchEvent() 在down startY;

    b. 計算滑動的距離
    float distanceY = endY - startY;
    int paddingTop = -控件高 + distanceY; View.setPadding(0,paddingTop,0,0);//動態的顯示下拉刷新控件

    c. 設置效果
    在手指按下時;檢測是否向下拉動屏幕,檢測當前狀態:如果不是下拉刷新,就設置其狀態爲下拉刷新並更新 View,設置動畫;
    響應的設置 釋放刷新;
    在手指離開屏幕時,設置狀態和對應的畫面,設置會調接口;

3. 下拉刷新鬆開處理和接口的定義

  1. 刷新的效果的實現

  2. 下拉刷新鬆開處理和接口的定義

    a. 定義下拉刷新接口;

    b. 定義接口實現類;

    c. 設置監聽並在監聽中設置請求數據的方法,並且更新時間;

4. 自定義ListView(加載更多)

  1. 添加加載更多佈局

    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);
    
  2. 拖動到底部的時候顯示加載更多佈局

    a. 設置監聽,在 onScrollStateChanged() 中判斷,是否加載到最後一條數據;

    b. 當加載到最後一條時,顯示 該視圖;並回調加載更多的方法;

  3. 判斷完整顯示輪播圖分析

    a. 此時存在BUG:當列表在更多數據位置時,稍微向下滑動,就會直接返回到頂部進行刷新操作;

    b. 解題思路:當頂部的輪播圖新聞頁完全顯示時,向下滑動才進行刷新操作;如果不能完全顯示輪播圖,就執行 ListView 的向上滾動;

  4. 判斷輪播圖是否完全顯示

    a. 獲取 輪播圖 和 ListView 的Y座標,如果輪播圖的座標 ≥ 對方的Y座標時,才進行刷新操作;

    b. 如果不是完全顯示時,在滑動時直接 break;而不進行刷新操作;

    c. 誤以爲是事件衝突,其實不是;

5. 把下拉刷新抽取成第三方庫並且使用

  1. 新建 module;
  2. 把代碼、佈局等文件添加進來;
  3. 依賴並使用;
  4. 寫一個案例,方便其他用戶理解使用

6. PullToRefresh下拉刷新的使用

  1. PullToRefresh簡介

    PullToRefresh是一套實現下拉刷新庫,它支持:1. ListView;2.ExpandableListView;3. GridView;4.WebView;5. ScrollView;6. HorizontalScrollView;7. ViewPager

  2. PullToRefresh集成

    a. 關聯庫PullToRefresh庫

    b.把新聞詳情頁面的代碼拷貝到專題詳情頁面

    c.把TabDetailPager代碼複製重新創建新類TopicTabDetailPager

    d.佈局文件新增加topic_tab_detailpager.xml,並引用案例中需要的佈局;

    e. 實例化,並在 initView 方法中設置監聽和添加頭部
    f. 設置回調完成等

盲區

  1. 本博客根據尚硅谷項目實戰: 北京新聞.學習整理;

其他筆記

新聞APP其他筆記

  1. day01
    第一天的學習筆記: 新聞APP01.
  2. day02
    第二天的學習筆記: 新聞APP02.
  3. day03
    第三天的學習筆記: 新聞APP03.
  4. day04
    第四天的學習筆記: 新聞APP04.
  5. day05
    第五天的學習筆記: 新聞APP05.
  6. day06
    第六天的學習筆記:新聞APP06.
  7. day07
    第七天的學習筆記:新聞APP07.

購物商城APP學習筆記

購物商城APP學習筆記:購物商城

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章