我们专注攀枝花网站设计 攀枝花网站制作 攀枝花网站建设
成都网站建设公司服务热线:400-028-6601

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

android分页,android分页menu

android软件开发怎样实现分页功能

ListView分页:

成都网站建设哪家好,找创新互联!专注于网页设计、成都网站建设、微信开发、小程序设计、集团成都定制网页设计等服务项目。核心团队均拥有互联网行业多年经验,服务众多知名企业客户;涵盖的客户类型包括:成都广告制作等众多领域,积累了大量丰富的经验,同时也获得了客户的一致赞许!

(一)、目的:

Android 应用开发中,采用ListView组件来展示数据是很常用的功能,当一个应用要展现很多的数据时,一般情况下都不会把所有的数据一次就展示出来,而是通过 分页的形式来展示数据,这样会有更好的用户体验。因此,很多应用都是采用分批次加载的形式来获取用户所需的数据。例如:微博客户端可能会在用户滑 动至列表底端时自动加载下一页数据,也可能在底部放置一个"查看更多"按钮,用户点击后,加载下一页数据。

(二)、核心技术点:

借助 ListView组件的OnScrollListener监听事件,去判断何时该加载新数据;

往服务器get传递表示页码的参数:page。而该page会每加载一屏数据后自动加一;

利用addAll()方法不断往list集合末端添加新数据,使得适配器的数据源每新加载一屏数据就发生变化;

利用适配器对象的notifyDataSetChanged()方法。该方法的作用是通知适配器自己及与该数据有关的view,数据已经发生变动,要刷新自己、更新数据。

(三)、 OnScrollListener监听事件 :

1、该监听器中有两个需要实现的方法:

onScrollStateChanged(AbsListView view, int scrollState):监听屏幕的滚动状态的变动情况

onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount):监听屏幕滚动的item的数量

2、 scrollState 回调顺序如下:

第1次:scrollState = SCROLL_STATE_TOUCH_SCROLL(1):表示正在滚动。当屏幕滚动且用户使用的触碰或手指还在屏幕上时为1

第2次:scrollState =SCROLL_STATE_FLING(2) :表示手指做了抛的动作(手指离开屏幕前,用力滑了一下,屏幕产生惯性滑动)。

第3次:scrollState =SCROLL_STATE_IDLE(0) :表示屏幕已停止。屏幕停止滚动时为0。

3、 onScroll中参数讲解:

firstVisibleItem:当前窗口中能看见的第一个列表项ID(从0开始)

visibleItemCount:当前窗口中能看见的列表项的个数(小半个也算)

totalItemCount:列表项的总数

4、思路:

当滚到最后一条,加载新数据;

适配器的数据源要进行累加:totalList.addAll(list);

数据发生变化,适配器通知:adapter.notifyDataSetChanged();【牢记】

判断是否滚到最后一行。

(五)、核心代码:

1、布局文件的核心代码:

RelativeLayoutxmlns:android=""

android:layout_width="fill_parent"

android:layout_height="fill_parent"

ListView

android:id="@+id/listView_main"

android:layout_below="@+id/button_main_init"

android:layout_width="match_parent"

android:layout_height="match_parent"

/ListView

LinearLayout

android:id="@+id/layout_main_nextpage"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:background="#000"

android:visibility="invisible"

android:gravity="center"

android:onClick="clickButton"

android:padding="5dp"

ProgressBar

android:id="@+id/progressBar_main"

style="?android:attr/progressBarStyleSmall"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/

TextView

android:id="@+id/text_main_nextpage"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginLeft="10dp"

android:textSize="18sp"

android:onClick="clickButton"

android:textColor="#fff"

android:text="点击加载更多数据"/

/LinearLayout

/RelativeLayout

2、Activity页面核心代码:

publicclass MainActivity extends Activity {

privateStringTAG= "MainActivity";

privateListView listView_main;

privateLinearLayout layout_main_nextpage;

private MySQLiteDatabaseHelper dbHelper = null;

// 用于分页显示数据的属性

privateintpageSize= 30;// 每页显示的条数

privateintcurPage= 1;

privateintrowCount= 0;

privateintpageCount= 0;// 总页数

privatebooleanisBottom=false;// 判断是否滚动到数据最后一条

private ListMapString, Object totalList = null;// 加载到适配器中的数据源

private SimpleAdapter adapter = null;

@Override

protectedvoid onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

listView_main = (ListView) findViewById(R.id.listView_main);

layout_main_nextpage = (LinearLayout) findViewById(R.id.layout_main_nextpage);

// 实例化访问数据库帮助类

dbHelper = new MySQLiteDatabaseHelper();

// 获取数据表一共有多少条,从而计算共有多少页

rowCount=dbHelper.selectCount("select id from android_basic",null);

// 计算总页码数

pageCount = (int) Math.ceil(rowCount / (float) pageSize);

// 如果当前页为第一页,则数据源集合中就是第一页的内容

if (curPage == 1) {

totalList = getCurpageList(1);

}

adapter = new SimpleAdapter(this, totalList,

R.layout.item_listview_main, new String[] { "_id", "title" },

newint[] { R.id.text_item_listview_id,

R.id.text_item_listview_title});

listView_main.setAdapter(adapter);

// 给ListView对象设置滚动监听器,以此来判断是否已经滚动到最后一条,从而决定是否加载新数据

listView_main.setOnScrollListener(new OnScrollListener() {

@Override

publicvoid onScrollStateChanged(AbsListView view, int scrollState) {

if (isBottom) {

// 如果滚到最后一条数据(即:屏幕最底端),则显示:“加载更多新数据”

if(curPage pageCount) {

layout_main_nextpage.setVisibility(View.VISIBLE);

}

} else {

layout_main_nextpage.setVisibility(View.GONE);

}

}

@Override

publicvoid onScroll(AbsListView view, int firstVisibleItem,

int visibleItemCount, int totalItemCount) {

// Log.i(TAG, "==" + firstVisibleItem + ":::" + visibleItemCount

// + ":::" + totalItemCount);

// 判断是否已经滚动到了最后一条,从而决定是否提示加载新数据

isBottom = (firstVisibleItem + visibleItemCount == totalItemCount);

}

});

}

publicvoid clickButton(View view) {

switch (view.getId()) {

caseR.id.layout_main_nextpage:

// Log.i(TAG, "==" + curPage + ":::" + pageCount);

// 如果不是最后一页,则让当前页码累加,让数据源累加新数据,并通知适配器信息发生变化

if(curPage pageCount) {

curPage++;

totalList.addAll(getCurpageList(curPage));

adapter.notifyDataSetChanged();

}

// 只要点击了提示“加载新数据”的信息,就让其隐藏

layout_main_nextpage.setVisibility(View.GONE);

break;

default:

break;

}

}

// 获取每一页的数据,返回List集合

private ListMapString, Object getCurpageList(int currentPage) {

int offset = (currentPage - 1) * pageSize;

String sql = "select id _id ,title from android_basic limit ? , ?";

returndbHelper.selectData(sql, new String[] { offset + "",

pageSize + "" });

}

}

Android开源项目PDFView如何加分页

使用拆分文档功能。

在PDF编辑器中,对pdf文件进行分页,还可以使用拆分文档功能。拆分文档功能在功能栏的“文档”中。在点击拆分文档后,同样会弹出对应的对话框,我们将其中设置调整一下,其中每次拆分页数是可以根据需求进行更改的,在完善好其他设置之后,点击确定即可完成pdf分页的操作。

Android 分页加载(paging)断网重连,重新加载的解决方案

最近在使用Android官方提供的paging组件进行分页功能的时候,遇到了一个问题。首先,paging每次显示一页的数据,下滑到一定程度以后发送第二次取数据的api,以此达到分页的效果。

当我们第一次显示成功以后,断开网络,然后划到底部。这个时候,发送API失败了。重新链接以后,再往下滑动,也不会有任何反应。这显然跟我们实际体验是有区别的。下面说一下具体的方法。

具体例子可以参考谷歌github上 例子

这里贴一个关于描述paging使用的文章,我觉得非常好,可以看一下,我这里不详细说了。

主要分三个部分

DataSource

PageList

PageListAdapter

其中,DataSource是负责处理分页。

核心是 三个方法

paging在向下滑动的过程中,到达指定的位置以后,会执行loadAfter,来获取下一页的数据。但是这个处理只会执行一次,这就是为什么断网以后,重连以后,再滑动也不会有反应了。

通过上面的分析的原因,我们知道了原因是获取下一页的数据只会执行一次,那么我们对应的方法也就很好理解了,我们在需要的时候,再执行一次loadAfter就可以达到我们需要的效果了。

我这边,是在recyclerview滑动到最底部的时候,重新执行loadAfter

DataSource

重新执行的方法

核心部分在retry。当我们发送API失败以后,retry保存当前失败的API处理操作。我们在需要的时候,去调用 retryAllFailed() 方法,重新执行这次的API

顺便一说,这里用到的是携程发送API,如果在retry的过程中,不用 GlobalScope.launch 的话,可能会阻塞主线程,导致卡顿。

Android listview怎么实现滚动分页

通常这也分为两种方式,一种是设置一个按钮,用户点击即加载。另一种是当用户滑动到底部时自动加载。今天我就和大家分享一下这个功能的实现。

首先,写一个xml文件,moredata.xml,该文件即定义了放在listview底部的视图:

?xml version="1.0" encoding="utf-8"?

LinearLayout xmlns:android=""

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

Button

android:id="@+id/bt_load"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="加载更多数据" /

ProgressBar

android:id="@+id/pg"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

android:visibility="gone"

/

/LinearLayout

可以看到是一个按钮和一个进度条。因为只做一个演示,这里简单处理,通过设置控件的visibility,未加载时显示按钮,加载时就显示进度条。

写一个item.xml,大家应该很熟悉了。用来定义listview的每个item的视图。

?xml version="1.0" encoding="utf-8"?

LinearLayout xmlns:android=""

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

TextView

android:id="@+id/tv_title"

android:textSize="20sp"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="5dp"

/

TextView

android:textSize="12sp"

android:id="@+id/tv_content"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="5dp"

/

/LinearLayout

main.xml就不贴了,整个主界面就一个listview。

直接先看下Activity的代码,在里面实现分页效果。

package com.notice.moredate;

import java.util.ArrayList;

import java.util.HashMap;

import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.AbsListView;

import android.widget.AbsListView.OnScrollListener;

import android.widget.Button;

import android.widget.ListView;

import android.widget.ProgressBar;

import android.widget.SimpleAdapter;

import android.widget.Toast;

public class MoreDateListActivity extends Activity implements OnScrollListener {

// ListView的Adapter

private SimpleAdapter mSimpleAdapter;

private ListView lv;

private Button bt;

private ProgressBar pg;

private ArrayListHashMapString,String list;

// ListView底部View

private View moreView;

private Handler handler;

// 设置一个最大的数据条数,超过即不再加载

private int MaxDateNum;

// 最后可见条目的索引

private int lastVisibleIndex;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

MaxDateNum = 22; // 设置最大数据条数

lv = (ListView) findViewById(R.id.lv);

// 实例化底部布局

moreView = getLayoutInflater().inflate(R.layout.moredate, null);

bt = (Button) moreView.findViewById(R.id.bt_load);

pg = (ProgressBar) moreView.findViewById(R.id.pg);

handler = new Handler();

// 用map来装载数据,初始化10条数据

list = new ArrayListHashMapString,String();

for (int i = 0; i 10; i++) {

HashMapString, String map = new HashMapString, String();

map.put("ItemTitle", "第" + i + "行标题");

map.put("ItemText", "第" + i + "行内容");

list.add(map);

}

// 实例化SimpleAdapter

mSimpleAdapter = new SimpleAdapter(this, list, R.layout.item,

new String[] { "ItemTitle", "ItemText" },

new int[] { R.id.tv_title, R.id.tv_content });

// 加上底部View,注意要放在setAdapter方法前

lv.addFooterView(moreView);

lv.setAdapter(mSimpleAdapter);

// 绑定监听器

lv.setOnScrollListener(this);

bt.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

pg.setVisibility(View.VISIBLE);// 将进度条可见

bt.setVisibility(View.GONE);// 按钮不可见

handler.postDelayed(new Runnable() {

@Override

public void run() {

loadMoreDate();// 加载更多数据

bt.setVisibility(View.VISIBLE);

pg.setVisibility(View.GONE);

mSimpleAdapter.notifyDataSetChanged();// 通知listView刷新数据

}

}, 2000);

}

});

}

private void loadMoreDate() {

int count = mSimpleAdapter.getCount();

if (count + 5 MaxDateNum) {

// 每次加载5条

for (int i = count; i count + 5; i++) {

HashMapString, String map = new HashMapString, String();

map.put("ItemTitle", "新增第" + i + "行标题");

map.put("ItemText", "新增第" + i + "行内容");

list.add(map);

}

} else {

// 数据已经不足5条

for (int i = count; i MaxDateNum; i++) {

HashMapString, String map = new HashMapString, String();

map.put("ItemTitle", "新增第" + i + "行标题");

map.put("ItemText", "新增第" + i + "行内容");

list.add(map);

}

}

}

@Override

public void onScroll(AbsListView view, int firstVisibleItem,

int visibleItemCount, int totalItemCount) {

// 计算最后可见条目的索引

lastVisibleIndex = firstVisibleItem + visibleItemCount - 1;

// 所有的条目已经和最大条数相等,则移除底部的View

if (totalItemCount == MaxDateNum + 1) {

lv.removeFooterView(moreView);

Toast.makeText(this, "数据全部加载完成,没有更多数据!", Toast.LENGTH_LONG).show();

}

}

@Override

public void onScrollStateChanged(AbsListView view, int scrollState) {

// 滑到底部后自动加载,判断listview已经停止滚动并且最后可视的条目等于adapter的条目

if (scrollState == OnScrollListener.SCROLL_STATE_IDLE

lastVisibleIndex == mSimpleAdapter.getCount()) {

// 当滑到底部时自动加载

// pg.setVisibility(View.VISIBLE);

// bt.setVisibility(View.GONE);

// handler.postDelayed(new Runnable() {

//

// @Override

// public void run() {

// loadMoreDate();

// bt.setVisibility(View.VISIBLE);

// pg.setVisibility(View.GONE);

// mSimpleAdapter.notifyDataSetChanged();

// }

//

// }, 2000);

}

}

}


当前题目:android分页,android分页menu
地址分享:http://shouzuofang.com/article/dsdggdh.html

其他资讯