1. 程式人生 > >Android-PullToRefresh 分頁請求網路資料的使用

Android-PullToRefresh 分頁請求網路資料的使用

今天空閒,就下載了chrisbanesAndroid-PullToRefresh,對其Sample進行了簡單的修改,完成分頁獲取網路資料。(資料放於七牛雲上了)

上程式碼


/*******************************************************************************
 * Copyright 2011, 2012 Chris Banes.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *******************************************************************************/
package com.handmark.pulltorefresh.samples;

import java.util.ArrayList;
import java.util.List;

import android.annotation.SuppressLint;
import android.app.ListActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.text.format.DateUtils;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode;
import com.handmark.pulltorefresh.library.PullToRefreshBase.OnLastItemVisibleListener;
import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener;
import com.handmark.pulltorefresh.library.PullToRefreshBase.State;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
import com.handmark.pulltorefresh.library.extras.SoundPullEventListener;
import com.handmark.pulltorefresh.samples.GetNetJsonData.ItemAttri;

/**
 * ①佈局檔案中使用PullToRefreshListView,findViewById
 * 
 * ②設定滑動模式
 * 
 * ③設定重新整理監聽事件
 * 
 * a、getCurrentMode 判斷當前重新整理的Mode:上拉、下拉
 * 
 * b、上拉重新整理只請求首頁資料 toPage = 1、isMore = true
 * 
 * c、下拉重新整理 toPage++,根據isMore來提示顯示資訊
 * 
 * ④非同步執行緒請求資料
 * 
 * a、有返回資料isMore=true;
 * 
 * b、否則,isMore=false 並通知主執行緒
 * 
 * ⑤非同步執行緒完成 執行onRefreshComplete操作
 * 
 */

@SuppressLint("HandlerLeak")
public final class PullToRefreshListActivity extends ListActivity {
	private final String TAG = "PullToRefreshListActivity";
	/** 首次網路請求頁碼 */
	private static final int FIRST_PAGE = 1;
	/** 資料請求頁碼 **/
	private int toPage = 1;
	/** 更多的網路資料 **/
	private boolean isMore = true;

	private List<ItemAttri> mListData;// 儲存網路資料

	private PullToRefreshListView mPullRefreshListView;
	private ListViewAdapter mAdapter;// listView的介面卡

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_ptr_list);

		initView();

		// 初始化監聽
		initEvent();

		// ListView actualListView = mPullRefreshListView.getRefreshableView();

		// Need to use the Actual ListView when registering for Context Menu
		// registerForContextMenu(actualListView);

		// 獲取首頁資料並設定listView
		mListData = new ArrayList<GetNetJsonData.ItemAttri>();
		new GetDataTask().execute(FIRST_PAGE);

	}

	private void initView() {
		mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list);
		// 滑動模式設定為雙向滑動
		mPullRefreshListView
				.setMode(mPullRefreshListView.getMode() == Mode.BOTH ? Mode.PULL_FROM_START
						: Mode.BOTH);

	}

	/**
	 * 初始化監聽事件
	 */
	private void initEvent() {
		// 設定listView的滑動重新整理監聽
		mPullRefreshListView
				.setOnRefreshListener(new OnRefreshListener<ListView>() {
					@Override
					public void onRefresh(
							PullToRefreshBase<ListView> refreshView) {

						// 獲取當前時間並格式化
						String label = DateUtils.formatDateTime(
								getApplicationContext(),
								System.currentTimeMillis(),
								DateUtils.FORMAT_SHOW_TIME
										| DateUtils.FORMAT_SHOW_DATE
										| DateUtils.FORMAT_ABBREV_ALL);

						// Update the LastUpdatedLabel
						refreshView.getLoadingLayoutProxy()
								.setLastUpdatedLabel(label);

						if (PullToRefreshBase.Mode.PULL_FROM_START == mPullRefreshListView
								.getCurrentMode()) {// 下拉重新整理

							mPullRefreshListView.getLoadingLayoutProxy()
									.setRefreshingLabel("請稍等...");
							mPullRefreshListView.getLoadingLayoutProxy()
									.setPullLabel("下拉重新整理...");
							mPullRefreshListView.getLoadingLayoutProxy()
									.setReleaseLabel("鬆開自動重新整理");

							// 重置集合資料
							mListData = new ArrayList<ItemAttri>();
							new GetDataTask().execute(FIRST_PAGE);

							// 還原toPage初始值
							toPage = 1;
							// 還原上拉載入控制變數
							isMore = true;

						} else if (PullToRefreshBase.Mode.PULL_FROM_END == mPullRefreshListView
								.getCurrentMode()) {// 上拉重新整理

							// 上拉重新整理時,逐步載入新介面
							toPage++;

							if (isMore) {// 上一次請求有資料
								// 自定義上拉header內容

								mPullRefreshListView.getLoadingLayoutProxy()
										.setPullLabel("上拉重新整理...");
								mPullRefreshListView.getLoadingLayoutProxy()
										.setRefreshingLabel("正在為你載入更多賽程內容...");
								mPullRefreshListView.getLoadingLayoutProxy()
										.setReleaseLabel("鬆開自動重新整理...");
							} else {
								// 上一次請求已經沒有資料了
								mPullRefreshListView.getLoadingLayoutProxy()
										.setPullLabel("沒有更多了...");
								mPullRefreshListView.getLoadingLayoutProxy()
										.setRefreshingLabel("沒有更多了...");
								mPullRefreshListView.getLoadingLayoutProxy()
										.setReleaseLabel("沒有更多了...");
							}
							new GetDataTask().execute(toPage);
						}

					}
				});

		// Add an end-of-list listener
		mPullRefreshListView
				.setOnLastItemVisibleListener(new OnLastItemVisibleListener() {

					@Override
					public void onLastItemVisible() {
						// listView最後一個item可見時觸發
						Toast.makeText(PullToRefreshListActivity.this,
								"End of List!", Toast.LENGTH_SHORT).show();
					}
				});

		/**
		 * Add Sound Event Listener
		 */
		//SoundPullEventListener<ListView> soundListener = new SoundPullEventListener<ListView>(
		//		this);
		//soundListener.addSoundEvent(State.PULL_TO_REFRESH, R.raw.pull_event);
		//soundListener.addSoundEvent(State.RESET, R.raw.reset_sound);
		//soundListener.addSoundEvent(State.REFRESHING, R.raw.refreshing_sound);
		//mPullRefreshListView.setOnPullEventListener(soundListener);

	}

	private class GetDataTask extends AsyncTask<Integer, Void, Void> {

		@Override
		protected Void doInBackground(Integer... params) {
			// 本次請求的資料集合
			List<ItemAttri> currData = new ArrayList<ItemAttri>();
			currData = new GetNetJsonData().getDataFromJson(params[0]);
			if (!currData.isEmpty()) {
				// 有資料返回
				// 資料加入集合中
				mListData.addAll(currData);
			} else {
				// 沒有資料
				isMore = false;
				// 向主執行緒傳送通知
				mHandler.sendEmptyMessage(0);
				// 沒有資料toPage--
				toPage--;
			}

			return null;
		}

		@Override
		protected void onPostExecute(Void v) {

			if (mAdapter == null) {
				mAdapter = new ListViewAdapter();

				// You can also just use setListAdapter(mAdapter) or
				// mPullRefreshListView.setAdapter(mAdapter)
				mPullRefreshListView.setAdapter(mAdapter);
			} else {
				mAdapter.notifyDataSetChanged();
			}

			Log.i(TAG, "page:" + toPage);
			// Call onRefreshComplete when the list has been refreshed.
			mPullRefreshListView.onRefreshComplete();// 完成重新整理動作

			super.onPostExecute(v);
		}
	}

	/**
	 * 接收子執行緒傳遞出來的資訊
	 */
	private Handler mHandler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			Toast.makeText(PullToRefreshListActivity.this, "沒有更多了",
					Toast.LENGTH_SHORT).show();
		}
	};

	private class ListViewAdapter extends BaseAdapter {

		@Override
		public int getCount() {
			return mListData.size();
		}

		@Override
		public Object getItem(int position) {
			return mListData.get(position);
		}

		@Override
		public long getItemId(int position) {
			return 0;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ViewHolder holder = null;
			if (convertView == null) {
				holder = new ViewHolder();
				convertView = getLayoutInflater().inflate(
						R.layout.item_list_view, null);
				holder.tvTitle = (TextView) convertView
						.findViewById(R.id.tv_title);
				holder.tvTime = (TextView) convertView
						.findViewById(R.id.tv_time);
				holder.tvContent = (TextView) convertView
						.findViewById(R.id.tv_content);

				convertView.setTag(holder);

			} else {
				holder = (ViewHolder) convertView.getTag();
			}

			holder.tvTitle.setText(mListData.get(position).title);
			holder.tvTime.setText(mListData.get(position).time);
			holder.tvContent.setText(mListData.get(position).content);

			return convertView;
		}

		private class ViewHolder {
			TextView tvTitle;
			TextView tvTime;
			TextView tvContent;
		}

	}
	
}

模擬資料存放在七牛雲上

GetNetJsonData.java

package com.handmark.pulltorefresh.samples;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

/**
 * 獲取模擬資料
 */
public class GetNetJsonData {

	/**
	 * 獲取網路json資料
	 * 
	 * @return 返回資料的list形式
	 * @throws Exception
	 */
	public List<ItemAttri> getDataFromJson(int pageNum) {
		List<ItemAttri> dataList = new ArrayList<ItemAttri>();
		String path = "http://jp-testdata.qiniudn.com/%40%2FlistDataPage"
				+ pageNum + ".json";
		URL url;
		try {
			url = new URL(path);

			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setReadTimeout(5000);
			conn.setRequestMethod("GET");
			if (HttpURLConnection.HTTP_OK == conn.getResponseCode()) {
				InputStream instream = conn.getInputStream();
				dataList = parseJSON(instream);
			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		for (int i = 0; i < dataList.size(); i++) {
			Log.i("GetSimulationData", "" + dataList.get(i).title);
		}

		return dataList;
	}

	/**
	 * 解析JSON
	 */
	private List<ItemAttri> parseJSON(InputStream instream) {

		List<ItemAttri> lst = new ArrayList<ItemAttri>();
		byte[] data;
		try {
			data = IOUtils.read(instream);

			String jsonStr = new String(data);
			JSONArray array = new JSONArray(jsonStr);
			for (int i = 0; i < array.length(); i++) {
				JSONObject jsonObj = (JSONObject) array.getJSONObject(i);
				ItemAttri v = new ItemAttri(jsonObj.getString("content"),
						jsonObj.getString("time"), jsonObj.getString("title"));
				lst.add(v);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} catch (JSONException e) {
			e.printStackTrace();
		}
		return lst;
	}

	/**
	 * 模擬實體類
	 */
	public class ItemAttri {
		public String content;
		public String time;
		public String title;

		public ItemAttri(String content, String time, String title) {
			super();
			this.content = content;
			this.time = time;
			this.title = title;
		}
	}

}

class IOUtils {
	/**
	 * 讀取輸入流為byte[]陣列
	 */
	static byte[] read(InputStream instream) throws IOException {
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		byte[] buffer = new byte[1024];
		int len = 0;
		while ((len = instream.read(buffer)) != -1) {
			bos.write(buffer, 0, len);
		}
		return bos.toByteArray();
	}
}



相關推薦

Android-PullToRefresh 請求網路資料的使用

今天空閒,就下載了chrisbanes的Android-PullToRefresh,對其Sample進行了簡單的修改,完成分頁獲取網路資料。(資料放於七牛雲上了) 上程式碼 /*************************************************

Android之ListView獲取網路資料(伺服器端)(一)

資料庫分頁: mysql:select pname from product limit 0,2;第一個引數是指要開始的地方,第二個引數是指每頁顯示多少條資料;注意:第一頁用0表示。 oracle:rownumber SqlServer:top 一、伺服器端 ①新建包com

ListView 載入網路資料

1.分頁載入思路 (1)判斷是否滑動到底部 (2)當滑動到底部,往資料來源中新增資料,然後呼叫adapter.notifyDataSetChanged()方法重新整理顯示的listView資料。 2. 下面是糗事百科載入的例項,載入效果如下(為了顯示效

Android GridView 載入資料

android UI 往右滑動,滑動到最後一頁就自動載入資料並顯示 如圖: Java程式碼   package cn.anycall.ju;  import java.util.ArrayList;  import

利用執行緒池實現Android客戶端的http網路資料請求工具類

該工具類值只實現了HTTP的get方法,參考get方法可輕鬆實現post、put、delete等方法,下面是get方法的實現 public class SimpleHttpClient { private static final String TAG = Sim

JS實現移動端下拉刷新更多請求功能方法2.0

keyframes 發生 usb 第一次 odr back eight urn 返回頂部 本次2.0升級版為js實現移動端加載更多下拉刷新更多分頁請求功能方法(數據一次請求,前端分頁,適用於數據流量較少,數據量壓力小的頁面)同時新增loading組件,turnToTop組件

通用請求返回類

color iquery 索引 using pre zed ron his 結束 using System.Runtime.Serialization; /// <summary> /// 通用分頁請求類 /// </summa

如何爬去資料--beautisoup

'''本次爬取講歷史網站'''#!usr/bin/env python#-*- coding:utf-8 _*-"""@author:Hurrican@file: 分頁爬取資料.py@time: 2018/11/03 9:30"""from bs4 import BeautifulSoupimport req

用AFN請求網路資料時出錯:(Assertion failure in -[AFHTTPRequestSerializer requestWithMethod:URLString:parameter)

iOS 開發中使用AFN請求網路資料時出錯:(Assertion failure in -[AFHTTPRequestSerializer requestWithMethod:URLString:parameters:error:])。 原因是AFNetworking請求中含有中文,需要處理

Flutter初探 上下拉請求+計算器實現

Flutter初探 本文主要大致介紹Flutter 整體框架,簡單粗略的使用,深度暫且還沒有。 用Dart,寫了個計算器的demo和列表拉下重新整理請求demo,基本上入門flutter使用, 原始碼可在文章後檢視。 目錄 一、關於Flutter 二、程式碼

Android P 9.0請求網路 CLEARTEXT communication to host not permitted by network

原文:https://blog.csdn.net/qq_18620851/article/details/80617549  問題: 由於 Android P 限制了明文流量的網路請求,非加密的流量請求都會被系統禁止掉。 如果當前應用的請求是 htttp 請求,而非 https ,

資料載入(有網路請求網路資料網路時載入資料庫資料

//NetWork 進行網路判斷 import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; public class NetWork {

UrlConnection請求網路資料

1.Get請求 try { //1 定義 URL 地址 URL url = new URL(地址 + 傳過來的引數); //ctrl + h 檢視類的繼承結構 //ctrl + q 檢視方法資訊 //2 開啟連線 H

在 vue cli3 的專案中配置雙服務,模擬 ajax 請求

最近安裝了下vue cli3版本,與 cli 2 相比,檔案少了,以前配置方法也不管用了。demo 中的大量的資料,需要做成 ajax 請求的方式來展示資料,因此,需要啟動兩個服務,一個用作前端請求,一個用作後端傳送。 雙服務的配置方法在 build / webpack.dev.conf.js 中寫入。

在 vue cli3 的項目中配置雙服務,模擬 ajax 請求

new css listen -m dir ble col export code 最近安裝了下vue cli3版本,與 cli 2 相比,文件少了,以前配置方法也不管用了。demo 中的大量的數據,需要做成 ajax 請求的方式來展示數據,因此,需要啟動兩個服務,一個用作

SSM_CRUD新手練習(7)Spring單元測試請求

          好久沒寫這個系列部落格了是因為本人去公司實習去了,公司用的是Spring+SpingMvc+Hibernate現在有時間了不管怎麼樣繼續把這個專案寫完。   因為機器的原因,我的環境變成了IDEA+oracle+1.8+tomc

SSM_CRUD新手練習(10)返回的JSON資料

   我們完成了員工的分頁查詢,但是現在這種做法只能適應瀏覽器和伺服器的互動模式,但在移動網際網路時代,客戶端不僅僅只有瀏覽器,還有安卓和IOS客戶端。我們的解決方式是AJAX+JSON方式來實現平臺無關性。    所以我們現在需要改造我們的查詢。   &

Rxjava+Retrofit 觀察者模式 請求網路資料簡單使用

首先引入依賴 implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0' implementation 'com.squareup.retrofit2:converter-gson:2.4.0' implementation

HttpURLConnection 請求網路資料 簡單使用(成功方法)

import android.os.Handler; import android.os.Message; import com.google.common.io.CharStreams; import java.io.InputStreamReader; import java.net.H

php顯示資料庫資料

 <?php    //include "fenyshow.php";  header("content-type:text/html;charset=utf-8");  $page = 1;      $link = mysqli_connect ("localho