1. 程式人生 > >PullScrollView詳解(四)——完全使用listview實現下拉回彈(方法一)

PullScrollView詳解(四)——完全使用listview實現下拉回彈(方法一)

在前面三篇中,我為大家展示了使用ScrollView實現下拉回彈的效果。但如果ScrollView裡如果巢狀使用ListView就可能會出現問題,因為兩者都會有滑動監聽。操作起來可能會起衝突,然後解決了衝突問題,到後面頁面效能也會很差強人意。即然如此,那我們就直接使用listview來實現下拉回彈的效果就好了。
在這篇中,我先給大家展示一種比較容易出效果的方法——重寫overScrollBy()函式。在下一篇中,我們將模仿PullScrollView中的實現方式自己對OnTouchEvent()進行監聽、操作。

注意注意!!!!本篇文章講述的OverScrollBy(),大家應該把最大注意力放在《4、用途:捕捉當前listview是否到底或到頂》部分,至於下拉回彈,大家看看就好,OverScrollBy()實現的下拉回彈,bug一堆,根本無法實際運用到實際專案中,大家看看就好,下篇將帶著大家利用OnTouchEvent()實現下拉回彈的效果。


一、setOverScrollMode()與OverScrollBy()

1、OverScrollBy()

OverScrollBy()是Android 9 之後才新增的API. 用於設定listview滾出屏幕後的回彈效果。先看OverScrollBy()函式的定義:

  1. protectedboolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int
     maxOverScrollY, boolean isTouchEvent)   
它的引數多的有點讓人模糊,下面給大家說下各個引數的意思。這些意思目前大家看不懂也沒關係,先大致瞭解下,後面講例子時還會再講。
  • deltaX:當前X軸滑動的畫素數
  • deltaY:當前Y軸滑動的畫素數
  • scrollX:在加上deltaX值以前的X軸總的滑動量
  • scrollY:在加上deltaY值以前的Y軸總滑動量
  • scrollRangeX:
  • scrollRangeY:這兩個什麼意思,我也沒弄懂
  • maxOverScrollX:X軸最大的OverScroll範圍(最大可超過邊界的畫素)
  • maxOverscrollY:Y軸最大的OverScroll範圍(最大可超過邊界的畫素)
  • isTouchEvent:當前overScrollBy函式的呼叫是否由Touch事件引起的

2、setOverScrollMode()

上面OverScrollBy()是當listview超過頂部或者底部的時候,會被呼叫。那定義listView能不能超過頂部或底部滑動,也就是說讓不讓OverScrollBy()呼叫,是通過setOverScrollMode()函式來定義的。

  1. publicvoid setOverScrollMode(int mode)  
mode有三個取值:
  1. //一直允許超過頂部/底部下拉
  2. publicstaticfinalint OVER_SCROLL_ALWAYS = 0;  
  3. //只有Content足夠大到能scroll的時候,才允許超過頂部/底部下拉(系統預設值)
  4. publicstaticfinalint OVER_SCROLL_IF_CONTENT_SCROLLS = 1;  
  5. //不允許超過頂部/底部下拉
  6. publicstaticfinalint OVER_SCROLL_NEVER = 2;  
當然,我們也可以不設定setOverScrollMode(int mode),系統預設的滾動屬性為OVER_SCROLL_IF_CONTENT_SCROLLS;即只有listview的content足夠大到可以滾動的情況下,才允許超過頂部/底部下拉
這裡大家應該對OverScrollBy()有個初步的認識了,下面我們先看看怎麼實現下拉回彈,然後再講解,為什麼要這麼做。

二、簡單示例

先看下效果:


注意,overScrollBy()實現的回彈效果是不能設定下拉方向的,即,不但頂部下拉會回彈,在底部下拉時也會回彈。但從效果圖中也可以看到,頂部下拉會回彈,底部下拉是不會回彈的,這是因為在最終程式碼中做了頂部還是底部判斷,當在底部時,就不讓使用者上拉回彈了,至於怎麼做到的,來一起看程式碼吧。

下面我們就通過一個最簡單的例子來看下OverScrollBy()的用法及效果。

1、實現OverScrollView

首先,新建一個類OverScrollView,重寫ListView
程式碼如下:
  1. class OverScrollList extends ListView {  
  2.     //定義最大滾動高度
  3.     int mContentMaxMoveHeight = 300;  
  4.     public OverScrollList(Context context) {  
  5.         super(context);  
  6.     }  
  7.     public OverScrollList(Context context, AttributeSet attrs) {  
  8.         super(context, attrs);  
  9.     }  
  10.     public OverScrollList(Context context, AttributeSet attrs, int defStyle) {  
  11.         super(context, attrs, defStyle);  
  12.     }  
  13.     protectedboolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {  
  14.         returnsuper.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mContentMaxMoveHeight, isTouchEvent);  
  15.     }  
  16. }  

在這個類裡面,只做了兩件事:
第一:定義一下變數mContentMaxMoveHeight,來表示可滑動到最大高度
  1. int mContentMaxMoveHeight = 300;  
第二:重寫overScrollBy函式,把return語句中的maxOverScrollY替換成我們定義的mContentMaxMoveHeight;
  1. protectedboolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {  
  2.     returnsuper.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mContentMaxMoveHeight, isTouchEvent);  
  3. }  
要實現可以overscroll的listview就需要做這麼多,下面就是一如即往的往listview裡填充資料的部分了。

2、ListView填充資料

在填充資料前,還是給大家看一下MainActivity的佈局:(main.xml)
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3.               android:orientation="vertical"
  4.               android:layout_width="fill_parent"
  5.               android:layout_height="fill_parent"
  6.         >
  7.     <com.harvic.OverScrollDemo.OverScrollList
  8.             android:id="@+id/listview"
  9.             android:layout_width="match_parent"
  10.             android:layout_height="match_parent"/>
  11. </LinearLayout>
下面就是正式填充資料的環節了。

先建立一個XML來做為Item的佈局(item_layout.xml)
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <TextViewxmlns:android="http://schemas.android.com/apk/res/android"
  3.           android:id="@android:id/text1"
  4.           android:layout_width="match_parent"
  5.           android:layout_height="wrap_content"
  6.           android:gravity="center_vertical"
  7.           android:minHeight="40dp"
  8.           android:background="#ffffff"/>
然後就是在MainActivity中的填充資料的部分了,程式碼如下 :
  1. publicclass MainActivity extends Activity {  
  2.     private String[] mStrings = {"Abbaye de Belloc""Abbaye du Mont des Cats""Abertam""Abondance""Ackawi",  
  3.             "Acorn""Adelost""Affidelice au Chablis""Afuega'l Pitu""Airag""Airedale""Aisy Cendre",  
  4.             "Allgauer Emmentaler""Abbaye de Belloc""Abbaye du Mont des Cats""Abertam""Abondance""Ackawi",  
  5.             "Acorn""Adelost""Affidelice au Chablis""Afuega'l Pitu""Airag""Airedale""Aisy Cendre",  
  6. 相關推薦

    PullScrollView——完全使用listview實現方法

    在前面三篇中,我為大家展示了使用ScrollView實現下拉回彈的效果。但如果ScrollView裡如果巢狀使用ListView就可能會出現問題,因為兩者都會有滑動監聽。操作起來可能會起衝突,然後解決了衝突問題,到後面頁面效能也會很差強人意。即然如此,那我們就直接使用

    android 自定義ListView實現重新整理、分頁載入、點選事件——自定義控制元件學習

    package com.example.administrator.customerpulldownrefreshandpageload; import android.content.Context; import android.os.Handler; import android.os.Message

    PullScrollView進階----->圖片

    activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.

    Android實現ListView阻尼式效果

    最近想模仿小米MIUI V5簡訊裡面的一個功能——私密簡訊,它的入口在簡訊列表,列表往下拉到1/3左右,我用Eclipse上的工具截了圖,包括該結構的佈局,如下圖: 從它的UI結構可以看出,用的是層疊結構,即將ListView和一個普通View(取名叫privateEn

    IOS使用UItableView實現選單元件UITableView的使用方法

    一. 基礎版本 在登陸介面有時需要儲存已經登陸的賬號資訊,可以點開一個下拉選單選擇儲存的賬號,這裡是用UIKit的表格元件編寫一個下拉選單元件demo,實現思路如下: 1.首先在一個UIViewController裡放一個按鈕或者標籤框,用來顯示當

    Android UI 自定義ListView 實現重新整理 載入更多

    分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

    自定義ListView實現重新整理和上載入

    實現ListView的下拉重新整理和上拉載入,需要先新增headerView和footerView,通過在拖動的過程中,控制頭尾佈局的paddingTop實現。先把paddingTop設為負值,來隱藏header,在下拉的過程中,不斷改變headerView的p

    Android ListView 實現重新整理上載入

    1.簡介        無疑,在Android開發中,ListView是使用非常頻繁的控制元件之一,ListView提供一個列表的容易,允許我們以列表的形式將資料展示到介面上,但是Google給我們提供的原生ListView的控制元件,雖然在功能上很強大,但是在使用

    OSI七層 傳輸層Transport

    http 計算機 地址 包括 分組 tcp aik 全部 滿足 一、簡介   第四層的數據單元也稱作數據包(packets)。但是,當你談論TCP等具體的協議時又有特殊的叫法,TCP的數據單元稱為段(segments)而UDP協議的數據單元稱為“數據報(datagrams)

    OpenLayers官方示例之可重用地圖源Reusable Source

    目錄 一、示例簡介 二、程式碼詳解 一、示例簡介     這個示例展示如何更新地圖中的瓦片。     可以呼叫source.setUrl()來更新瓦片地圖源的URL,請注意,當更改瓦片地圖源的URL時,在載入完新的瓦片之前,將不會替換現

    「mysql優化專題」引擎(InnoDB,MyISAM)的內存優化攻略?9

    區域 order by 順序 重做日誌 浪費 變量 效率 攻略 分區 註意:以下都是在MySQL目錄下的my.ini文件中改寫(技術文)。 一、InnoDB內存優化 InnoDB用一塊內存區域做I/O緩存池,該緩存池不僅用來緩存InnoDB的索引塊,而且也用來緩存InnoD

    postfix郵箱服務器安裝、配置及其工作原理內附源碼包

    zhang 關閉防火墻 互聯 分享 接收郵件 目錄 ifconfig shutdown 數字 簡介 postfix是Wietse Venema在IBM的GPL協議之下開發的MTA(郵件傳輸代理)軟件。postfix是Wietse Venema想要為使用最廣泛的sendmai

    vue2.0 使用動態元件實現 Tab 標籤頁切換效果vue-cli

    在 vue 中,實現 Tab 切換主要有三種方式:使用動態元件,使用 vue-router 路由,使用第三方外掛。因為這次完成的功能只是簡單切換元件,再則覺得使用路由切換需要改變地址略微麻煩,所以使用的是動態元件實現,如果是在大型應用上,可能使用 vue-router 會方便

    Solidity 事件Event - 完全搞懂事件的使用

    wiki instr spa 同學 發現 sts 通過 inf 作用 很多同學對Solidity 中的Event有疑問,這篇文章就來詳細的看看Solidity 中Event到底有什麽用? 寫在前面 Solidity 是以太坊智能合約編程語言,閱讀本文前,你應該對以太坊、智能

    配置mac環境的JAVA_HOME 與 配置maven Mac上jdk的配置 ()在terminal中執行.class檔案

    (一)mac環境下,echo $JAVA_HOME 一般輸出為空,但有時候某些構件會需要有javahome的配置,這時就需要把Java home配置好。 步驟: 1, 命令列輸入: /usr/libexec/java_home 我的環境輸出是 /Library/Java/JavaVi

    爬蟲之刃----趕集網招聘類爬取案例(系列)

    前言 本篇承襲之前的系列文章,開始動真格。以趕集網招聘類資訊爬取為例,詳細解說爬蟲程式構建過程。 準備工作: 閱讀之前的系列一、系列二、系列三,有一定遞進關係 登陸趕集網,瞭解下“地形” OK,let’s go! 構建URL庫

    微信小程式學習筆記持續更新---征服scroll-view重新整理

    貼圖 大概實現這種使用swiper做tab切換,資料頁面下拉重新整理的效果。 官方提供的scroll-view作為容器,如果在scroll-view使用onPullDownRefresh實現下拉重新整理,會存在頁面重新整理卡,並且重新整理會出現在tab之上,使

    Android PullToRefresh ListView GridView 重新整理 使用

                    轉載請標明出處:http://blog.csdn.net/lmj623565791/article/details/38238749,本文出自:【張鴻洋的部落格】群裡一哥們今天聊天偶然提到這個git hub上的控制元件:pull-to-refresh ,有興趣的看下,例子中的功

    Android RecyclerView ()總結-並且實現重新整理資料,上載入資料功能

    我們使用的程式碼還是為以前文章寫的。 這一次我們主要實現的是下拉重新整理資料,和上拉載入資料,這裡我都用Thread.sleep(xxx)的方法來模擬獲取資料等待。 首先我們下拉重新整理的時候要用到: SwipeRefreshLayout 來看一下如何在

    Android學習之listView顯示列表2SimpleAdapter介面卡

                         ListView顯示下拉列表(2)(SimpleAdapter介面卡) 上一篇文章我大概介紹了listView的主要功能以及用ArrayAdapter陣列介面卡實現純文字的下拉列表。但是在現實生活中,純文字的使用率不是很高,更多的