自定义安卓实现数据分页功能
- 1、分页实现原理
- 2、基于tableView实现的数据展示。
- 3、具体实现效果展示:
- 最近基于客户要求做了个手持安卓端的软件,主要是用于数据和相关信息的查看功能。开始由于数据较少,查看的数据都是用的滚屏展示的,后来因为数据量大、经常要加载很久。所以要求实现分页。

1、分页实现原理
-
博主在网上看了比较多的分页模板、大致套路总结有两个思路:
-
(1)一步到位、一次性返回所有数据:将数据在后台封装好、类似于前端数据展示一样、用PageInfo进行封装数据,然后返回到前端。安卓端也相当于是一个前端,此方法相当于一步到位、一次请求返回所有数据,剩下的数据解析翻页啥就交给安卓端搞定了。
-
(2)单独请求每页数据、实时更新:后台编写个获取数据的接口。通过安卓端每次点击下一页发送一个http请求、携带页数参数。对应返回相应页数的一部分数据。相当于每次翻页都会单独发送请求返回数据。个人觉得对于数据实时增删要求较高切服务器压力不大可选用此类方法。
-
由于博主主要只需展示数据、未用到增删,考虑到每次分页都发请求可能会增加服务器压力,那就选用一次性到位的方法吧。而且分页展示用的是自定义的TableView,所以一切都是自己写的。以下是我自己写的一个分页demo、可能不套用、仅供提供思路参考!看看我的效果图吧、非专业UI界面有点丑、哈哈

2、基于tableView实现的数据展示。
public class TableView extends HorizontalScrollView {
}
//此处省略一万字,完整版请点最底下链接! 因为都是自定义的!仅提供思路!如想copy博主界面demo的可点最下方链接下载!
- 自定义分页插件: 后台直接返回的是JSONArray,此工具类作用就是解析后台返回的数据,定义一个pageBean封装每页的数据。下面写了三种数据格式、分别是List 、 JSONArray、 List 。可根据自己需求增改!
PageUtils
public class PageUtils {
private JSONArray currentJsonArray;
private List stringList;
public void setData(JSONArray currentJsonArray, List stringList){
this.currentJsonArray = currentJsonArray;
this.stringList = stringList;
}
public static PageBean getPageData(JSONArray currentJsonArray, int pageMax){
if(null == currentJsonArray || 0 == currentJsonArray.size()){
return null;
}
int everyPageLimit = pageMax -1;
PageBean pageData = new PageBean();
int cort = currentJsonArray.size() % everyPageLimit;
int sort = currentJsonArray.size() / everyPageLimit;
int pages = cort == 0 ? sort:sort+1;
pageData.setPages(pages); //总页数
HashMap> jsonPage = new HashMap<>();
for(int i=0; i json = new LinkedList<>();
if((i + 1)* everyPageLimit > currentJsonArray.size()){
json = currentJsonArray.subList(i * (everyPageLimit), currentJsonArray.size());
}else{
json = currentJsonArray.subList(i * (everyPageLimit), ((i + 1)* (everyPageLimit)));
}
jsonPage.put(i+1, json);
}
pageData.setJsonPage(jsonPage);
return pageData;
}
public static PageBean getPageArrayData(List currentJsonArray, int pageMax){
if(null == currentJsonArray || 0 == currentJsonArray.size()){
return null;
}
PageBean pageData = new PageBean();
int everyPageLimit = pageMax - 1;
int cort = currentJsonArray.size() % everyPageLimit;
int sort = currentJsonArray.size() / everyPageLimit;
int pages = cort == 0 ? sort:sort+1;
pageData.setPages(pages); //总页数
HashMap> jsonPage = new HashMap<>();
for(int i=0; i json = new LinkedList<>();
if((i + 1)* everyPageLimit >= currentJsonArray.size()){
json = currentJsonArray.subList(i * (everyPageLimit), currentJsonArray.size());
}else{
json = currentJsonArray.subList(i * (everyPageLimit), ((i + 1)* (everyPageLimit)));
}
jsonPage.put(i+1, json);
}
pageData.setMapPage(jsonPage);
return pageData;
}
public static PageBean getPageData(List currentJsonArray, int pageMax){
if(null == currentJsonArray || 0 == currentJsonArray.size()){
return null;
}
int everyPageLimit = pageMax -1;
PageBean pageData = new PageBean();
int cort = currentJsonArray.size() % everyPageLimit;
int sort = currentJsonArray.size() / everyPageLimit;
int pages = cort == 0 ? sort:sort+1;
pageData.setPages(pages); //总页数
HashMap> jsonPage = new HashMap<>();
for(int i=0; i json = new LinkedList<>();
if((i + 1)* everyPageLimit >= currentJsonArray.size()){
json = currentJsonArray.subList(i * (everyPageLimit), currentJsonArray.size());
}else{
json = currentJsonArray.subList(i * (everyPageLimit), ((i + 1)* (everyPageLimit)));
}
jsonPage.put(i+1, json);
}
pageData.setStringPage(jsonPage);
return pageData;
}
}
Pagebean
public class PageBean {
private int pages; //当前页数
//当前页的数据
private HashMap> stringPage ;
private HashMap> jsonPage ;
private HashMap> mapPage ;
public HashMap> getMapPage() {
return mapPage;
}
public void setMapPage(HashMap> mapPage) {
this.mapPage = mapPage;
}
public int getPages() {
return pages;
}
public void setPages(int pages) {
this.pages = pages;
}
public HashMap> getStringPage() {
return stringPage;
}
public void setStringPage(HashMap> stringPage) {
this.stringPage = stringPage;
}
public HashMap> getJsonPage() {
return jsonPage;
}
public void setJsonPage(HashMap> jsonPage) {
this.jsonPage = jsonPage;
}
}
3、具体实现效果展示:
public class AreaCtrlDetailActivity extends Activity {
private JSONArray resultJson ;
private boolean flag = false;
private TextView title;
private String areaType;
private String deptId;
String[] dataP ;
HashMap allAreaRollCallMap = new HashMap<>();
private LinearLayout tableLayout;
PageBean pageData = new PageBean();
private int curPage = 1;
int maxPage = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.demo_detail_list);
tableLayout = findViewById(R.id.tableBody);
getActionBar().show();
getActionBar().setBackgroundDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.bg));
getActionBar().setTitle("区域详情");
dataP = getIntent().getStringArrayExtra("rowData");
areaType = getIntent().getStringExtra(Constants.Param.AREA_TYPE);
deptId = getIntent().getStringExtra(Constants.Param.DEPT_ID);
freshPanel();
initTableView();
}
private void freshPanel() {
new Thread(new Runnable() {
@Override
public void run() {
getGlobalData();
}
}).start();
}
private synchronized void initTableView() {
if (!flag){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(null != pageData) {
refreshPanel(pageData.getJsonPage().get(curPage));
maxPage = pageData.getPages();
}else{
CommonCode.showMessage(AreaCtrlDetailActivity.this, "未查询到数据");
finish();
}
}
public void onQueryAddPageButtonClicked(View v){
if(curPage >= maxPage){
CommonCode.showMessage(AreaCtrlDetailActivity.this, "已到最后一页");
}else{
curPage++;
runOnUiThread(()->refreshPanel(pageData.getJsonPage().get(curPage)));
}
}
public void onQueryReducePageButtonClicked(View v){
if(curPage == 1){
CommonCode.showMessage(AreaCtrlDetailActivity.this, "已到首页");
}else{
curPage --;
runOnUiThread(()->refreshPanel(pageData.getJsonPage().get(curPage)));
}
}
void refreshPanel(List