亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

使用安卓自帶刷新控件實現ListView的上拉加載和下拉刷新

2019-11-07 23:29:47
字體:
來源:轉載
供稿:網友

前篇已經講過安卓自帶刷新控件沒有上拉加載需要自己自定義相關控件才能實現。先看下效果 這里寫圖片描述 xml布局如下:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.sw接下來是自定義刷新控件實現上拉加載了,本文以listView為例 幾點思路: 實現上拉加載需滿足一下幾點條件: 1.手勢上劃并達到一定距離 2.到底底部 3.當前為非加載狀態 該自定義類中設置一個接口回調對象以及里面的抽象方法,listview的滑動事件監聽調用該借口方法,具體代碼邏輯在某界面中繼承接口實現該方法 具體代碼奉上

package com.example.swiperefresh4listview;import android.content.Context;import android.support.v4.widget.SwipeRefreshLayout;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.ViewConfiguration;import android.widget.AbsListView;import android.widget.ListView;/** * 自定義View繼承SwipeRefreshLayout,添加上拉加載更多的布局屬性 */public class Swiperefresh4ListView extends SwipeRefreshLayout{
PRivate final int mScaledTouchSlop; private final View mFooterView; private ListView mListView; private OnLoadListener mOnLoadListener; /** 正在加載狀態*/ private boolean isLoading; public Swiperefresh4ListView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub // 填充底部加載布局 mFooterView = View.inflate(context, R.layout.view_footer, null); // 表示控件移動的最小距離,手移動的距離大于這個距離才能拖動控件 mScaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); // 獲取ListView,設置ListView的布局位置 if (mListView == null) { // 判斷容器有多少個孩子 if (getChildCount() > 0) { // 判斷第一個孩子是不是ListView if (getChildAt(0) instanceof ListView) { // 創建ListView對象 mListView = (ListView) getChildAt(0); // 設置ListView的滑動監聽 setListViewOnScroll(); } } } } /** * 在分發事件的時候處理子控件的觸摸事件 * @param ev * @return */ private float mDownY, mUpY; @Override public boolean dispatchTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: // 移動的起點 mDownY = ev.getY(); break; case MotionEvent.ACTION_MOVE: // 移動過程中判斷時候能下拉加載更多 if (canLoadMore()) { // 加載數據 loadData(); } break; case MotionEvent.ACTION_UP: // 移動的終點 mUpY = getY(); break; } return super.dispatchTouchEvent(ev); } /** * 判斷是否滿足加載更多條件 * @return */ private boolean canLoadMore() { // 1. 是上拉狀態 boolean condition1 = (mDownY - mUpY) >= mScaledTouchSlop; if (condition1) { System.out.println("是上拉狀態"); } // 2. 當前頁面可見的item是最后一個條目 boolean condition2 = false; if (mListView != null && mListView.getAdapter() != null) { condition2 = mListView.getLastVisiblePosition() == (mListView.getAdapter().getCount() - 1); } if (condition2) { System.out.println("是最后一個條目"); } // 3. 正在加載狀態 boolean condition3 = !isLoading; if (condition3) { System.out.println("不是正在加載狀態"); } return condition1 && condition2 && condition3; } /** * 處理加載數據的邏輯 */ private void loadData() { System.out.println("加載數據..."); if (mOnLoadListener != null) { // 設置加載狀態,讓布局顯示出來 setLoading(true); mOnLoadListener.onLoad(); } } /** * 設置加載狀態,是否加載傳入boolean值進行判斷,后期用來加載完成后隱藏布局 * @param loading */ public void setLoading(boolean loading) { // 修改當前的狀態 isLoading = loading; if (isLoading) { // 顯示布局 mListView.addFooterView(mFooterView); } else { // 隱藏布局 mListView.removeFooterView(mFooterView); // 重置滑動的坐標 mDownY = 0; mUpY = 0; } } /** * 設置ListView的滑動監聽 */ private void setListViewOnScroll() { mListView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // 移動過程中判斷能否能上拉加載更多 if (canLoadMore()) { // 加載數據 loadData(); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } }); } /** * 上拉加載的接口回調 */ public interface OnLoadListener { void onLoad(); } public void setOnLoadListener(OnLoadListener listener) { this.mOnLoadListener = listener; }}

上面代碼中有一個底部布局,可以自己定義就不黏貼上來了 記下來具體界面中調用給接口方法

package com.example.swiperefresh4listview;import java.util.ArrayList;import java.util.List;import java.util.Random;import com.example.swiperefresh4listview.Swiperefresh4ListView.OnLoadListener;import android.os.Bundle;import android.os.Handler;import android.support.v4.widget.SwipeRefreshLayout;import android.support.v7.app.AppCompatActivity;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.Toast;/** * 使用谷歌提供的SwipeRefreshLayout下拉控件進行下拉刷新和上拉加載 */public class MainActivity extends AppCompatActivity { private List<String> mList; private int mCount; private ArrayAdapter<String> mAdapter; private Swiperefresh4ListView swipeRefreshView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initUI(); reFresh(); } private void initUI() { swipeRefreshView = (Swiperefresh4ListView) findViewById(R.id.srl); ListView listView = (ListView) findViewById(R.id.lv); // 設置適配器數據 mList = new ArrayList<>(); for (int i = 0; i < 30; i++) { mList.add("我是laohu" + i + "號"); mCount++; } mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mList); listView.setAdapter(mAdapter); } private void reFresh() { // 設置顏色屬性的時候一定要注意是引用了資源文件還是直接設置16進制的顏色,因為都是int值容易搞混 // 設置下拉進度的背景顏色,默認就是白色的 swipeRefreshView.setProgressBackgroundColorSchemeResource(android.R.color.white); // 設置下拉進度的主題顏色 swipeRefreshView.setColorSchemeResources(R.color.colorAccent, R.color.colorPrimary, R.color.colorPrimaryDark); // 設置刷新出現的位置 swipeRefreshView.setProgressViewEndTarget(false,200); // 設置向下拉多少出現刷新 swipeRefreshView.setDistanceToTriggerSync(30); // 下拉時觸發SwipeRefreshLayout的下拉動畫,動畫完畢之后就會回調這個方法 swipeRefreshView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { //默認會自動刷新無需調用這個屬性setRefreshing(boolean d) // 這里是主線程一些比較耗時的操作,比如聯網獲取數據,需要放到子線程去執行 final Random random = new Random(); new Handler().postDelayed(new Runnable() { @Override public void run() {// 刷新數據在這里 mList.add(0, "我是天才" + random.nextInt(100) + "號"); mAdapter.notifyDataSetChanged(); Toast.makeText(MainActivity.this, "刷新了一條數據", Toast.LENGTH_SHORT).show(); // 加載完數據設置為不刷新狀態,將下拉進度收起來 swipeRefreshView.setRefreshing(false); } }, 1200); // 這個不能寫在外邊,不然會直接收起來 // swipeRefreshLayout.setRefreshing(false); } }); // 設置下拉加載更多 swipeRefreshView.setOnLoadListener(new OnLoadListener() { @Override public void onLoad() { // TODO Auto-generated method stub new Handler().postDelayed(new Runnable() { @Override public void run() { // 添加數據 for (int i = 30; i < 35; i++) { mList.add("我是小胡" + i + "號"); // 這里要放在里面刷新,放在外面會導致刷新的進度條卡住 mAdapter.notifyDataSetChanged(); } Toast.makeText(MainActivity.this, "數據加載完成", Toast.LENGTH_SHORT).show(); // 加載完數據隱藏掉上拉加載布局 swipeRefreshView.setLoading(false); } }, 1200); } }); }}

思考:使用官方的下拉刷新可以實現自定義下拉刷新樣式嗎? 好的,上拉加載已經實現,后面在實際刷新過程中,發現一個問題,就是下拉刷新在刷新過程中,如果下拉界面過短或者刷新顯示時常短,上拉到底部的時候,兩個會一起顯示,一個小bug,有待解決,還是第三方刷新比較好用。哪位大神看到能指導一二,以上代碼參考了網上資源,感謝各位大神分享。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久97久久97精品免视看| 精品中文字幕在线| 精品高清一区二区三区| 亚洲精品电影网| 91香蕉嫩草影院入口| 欧美日韩第一页| 欧美激情精品久久久久久大尺度| 久久99久国产精品黄毛片入口| 久久久精品视频在线观看| 国产主播在线一区| 久久激情视频久久| 国产精品久久久999| 色无极影院亚洲| 精品人伦一区二区三区蜜桃免费| 全色精品综合影院| 青青久久av北条麻妃黑人| 国产成人一区三区| 97视频在线播放| 亚洲精品ady| 亚洲国产精品小视频| 亚洲成**性毛茸茸| xxxx欧美18另类的高清| 亚洲视频自拍偷拍| 日韩成人av网址| 中文字幕日韩视频| 国产精品都在这里| 欧美精品制服第一页| 日韩视频免费在线观看| 97超级碰碰碰久久久| 国内精品视频一区| 日本不卡免费高清视频| 国产精品毛片a∨一区二区三区|国| 一区二区三区久久精品| 国产午夜精品一区理论片飘花| 国产精品女主播视频| 亚洲欧美国产一本综合首页| 久久久久五月天| 国产福利精品av综合导导航| 亚洲专区中文字幕| 国产精品美腿一区在线看| 久久在线免费观看视频| 在线观看欧美www| 亚洲福利小视频| 国产成人一区二区三区| 欧美精品免费在线观看| 91地址最新发布| 97在线视频免费观看| 欧美成人免费va影院高清| 91美女片黄在线观看游戏| 久久中国妇女中文字幕| 97成人精品区在线播放| 性欧美视频videos6一9| 欧洲午夜精品久久久| 亚洲无限av看| 91精品国产色综合久久不卡98口| 国产精品1区2区在线观看| 国产精品白嫩初高中害羞小美女| 久久久久久美女| 欧美日韩亚洲一区二区三区| 中文精品99久久国产香蕉| 国产欧美日韩精品在线观看| 亚洲精品一区在线观看香蕉| 2018中文字幕一区二区三区| 久久亚洲精品毛片| 国模gogo一区二区大胆私拍| 国产精品一区二区av影院萌芽| 亚洲欧美中文日韩v在线观看| 欧美性做爰毛片| 中文字幕一区二区三区电影| 亚洲视频电影图片偷拍一区| 久久精品91久久久久久再现| 国产在线视频2019最新视频| 日韩av网址在线| 欧美激情一区二区三区高清视频| 国内精品免费午夜毛片| 欧美成人合集magnet| 日韩欧美中文第一页| 国产视频亚洲视频| 欧美激情videos| 日韩高清有码在线| 久久香蕉国产线看观看av| 一本色道久久88综合日韩精品| 日韩亚洲精品视频| 日韩av在线免费观看一区| 久久久精品一区二区三区| 91精品免费视频| 91午夜理伦私人影院| 国产精品视频一区二区高潮| 午夜精品福利视频| 最新国产成人av网站网址麻豆| 欧美电影免费看| 日韩在线资源网| 亚洲亚裔videos黑人hd| 久久偷看各类女兵18女厕嘘嘘| 日韩免费高清在线观看| 久久精品人人爽| 91久久国产婷婷一区二区| 播播国产欧美激情| 久久久久久国产精品三级玉女聊斋| 国产精品一区二区性色av| 国产精品美女www| 国产日韩视频在线观看| 亚洲精品色婷婷福利天堂| 欧美老女人bb| 国内精品久久久久影院 日本资源| 久久亚洲精品国产亚洲老地址| 中文字幕亚洲字幕| 亚洲精品视频在线播放| 性欧美长视频免费观看不卡| 亚洲欧美日本伦理| 黑人狂躁日本妞一区二区三区| 一级做a爰片久久毛片美女图片| 国产精品爽爽ⅴa在线观看| 日韩av色在线| 久久精品免费电影| 亚洲国产99精品国自产| 亚洲第一色中文字幕| 国产精品一区二区女厕厕| 国产亚洲精品成人av久久ww| 日韩av大片免费看| 精品国产网站地址| 精品av在线播放| 97视频在线观看播放| 亚洲综合视频1区| 国产免费一区视频观看免费| 日韩大胆人体377p| 欧美精品一区二区免费| 91超碰中文字幕久久精品| 国产专区精品视频| 97精品视频在线| 欧美性xxxxx| 欧美激情亚洲激情| 久久久精品在线观看| 国产一区av在线| 日韩中文字幕视频| 欧美制服第一页| 亚洲精品久久久久中文字幕欢迎你| 久久精品国产欧美激情| 国产欧美一区二区三区四区| 91极品女神在线| 国产精品久久国产精品99gif| 久久免费观看视频| 欧美日韩免费区域视频在线观看| 日韩精品亚洲视频| 欧美电影免费播放| 欧美国产日韩在线| 成人做爽爽免费视频| 成人在线观看视频网站| 18久久久久久| 欧美视频在线观看免费网址| 91精品久久久久久久久久入口| 亚洲石原莉奈一区二区在线观看| 最新国产成人av网站网址麻豆| 国产欧美精品久久久| 久久久久久国产三级电影| 国产一区二区在线免费| 成人av在线网址| 午夜精品久久久久久久男人的天堂| 国产99久久精品一区二区| 国产脚交av在线一区二区| 2019中文字幕在线免费观看| 久久久久久久久久久91| 777国产偷窥盗摄精品视频| 中文字幕在线看视频国产欧美在线看完整|