Android-PullToRefresh 分頁請求網路資料的使用
今天空閒,就下載了chrisbanes的Android-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