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()函式的定義:
-
protectedboolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int
- 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()函式來定義的。
- publicvoid setOverScrollMode(int mode)
- //一直允許超過頂部/底部下拉
- publicstaticfinalint OVER_SCROLL_ALWAYS = 0;
- //只有Content足夠大到能scroll的時候,才允許超過頂部/底部下拉(系統預設值)
- publicstaticfinalint OVER_SCROLL_IF_CONTENT_SCROLLS = 1;
- //不允許超過頂部/底部下拉
- publicstaticfinalint OVER_SCROLL_NEVER = 2;
這裡大家應該對OverScrollBy()有個初步的認識了,下面我們先看看怎麼實現下拉回彈,然後再講解,為什麼要這麼做。
二、簡單示例
先看下效果:
注意,overScrollBy()實現的回彈效果是不能設定下拉方向的,即,不但頂部下拉會回彈,在底部下拉時也會回彈。但從效果圖中也可以看到,頂部下拉會回彈,底部下拉是不會回彈的,這是因為在最終程式碼中做了頂部還是底部判斷,當在底部時,就不讓使用者上拉回彈了,至於怎麼做到的,來一起看程式碼吧。
下面我們就通過一個最簡單的例子來看下OverScrollBy()的用法及效果。
1、實現OverScrollView
首先,新建一個類OverScrollView,重寫ListView程式碼如下:
- class OverScrollList extends ListView {
- //定義最大滾動高度
- int mContentMaxMoveHeight = 300;
- public OverScrollList(Context context) {
- super(context);
- }
- public OverScrollList(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
- public OverScrollList(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
- protectedboolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
- returnsuper.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mContentMaxMoveHeight, isTouchEvent);
- }
- }
在這個類裡面,只做了兩件事:
第一:定義一下變數mContentMaxMoveHeight,來表示可滑動到最大高度
- int mContentMaxMoveHeight = 300;
- protectedboolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
- returnsuper.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mContentMaxMoveHeight, isTouchEvent);
- }
2、ListView填充資料
在填充資料前,還是給大家看一下MainActivity的佈局:(main.xml)- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <com.harvic.OverScrollDemo.OverScrollList
- android:id="@+id/listview"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
- </LinearLayout>
先建立一個XML來做為Item的佈局:(item_layout.xml)
- <?xmlversion="1.0"encoding="utf-8"?>
- <TextViewxmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@android:id/text1"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:minHeight="40dp"
- android:background="#ffffff"/>
- publicclass MainActivity extends Activity {
- private String[] mStrings = {"Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",
- "Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale", "Aisy Cendre",
- "Allgauer Emmentaler", "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",
- "Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale", "Aisy Cendre",
-
相關推薦
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顯示下拉列表(2)(SimpleAdapter介面卡)
ListView顯示下拉列表(2)(SimpleAdapter介面卡) 上一篇文章我大概介紹了listView的主要功能以及用ArrayAdapter陣列介面卡實現純文字的下拉列表。但是在現實生活中,純文字的使用率不是很高,更多的