Android ListView分页,动态添加数据
1.ListView分页的实现,重点在于实现OnScrollListener接口,判断滑动到最后一项时,是否还有数据可以加载,
我们可以利用listView.addFootView(View v)方法进行提示
自定义一个ListView(这里本来想进行一些自定已修改的。。。实际代码并没有做)CornerListView
package com.example.testlistview; import android.widget.AbsListView;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView; public class CornerListView extends ListView{ public CornerListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
} public CornerListView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
} public CornerListView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
}
包含ListView的配置文件 activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.testlistview.MainActivity" > <com.example.testlistview.CornerListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_margin="10dip"
android:id="@+id/list"
>
</com.example.testlistview.CornerListView> </RelativeLayout>
ListView每一项的Item配置文件 listview_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:id="@+id/tvTitle"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="1"
android:gravity="center_horizontal"
></TextView>
</LinearLayout>
有更多数据时的配置文件more.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/tv_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="更多"
/>
<ProgressBar
android:id="@+id/loading"
style="@android:style/Widget.ProgressBar.Large"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:visibility="gone"
/>
</RelativeLayout>
CorernerListView对应的Adapter适配器 CornerAdapter.java
package com.example.testlistview; import java.util.List; import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView; public class CornerAdapter extends BaseAdapter{ LayoutInflater inflater;
public List<String> list;
private Context context; public CornerAdapter(List<String> list, Context context) {
this.list = list;
this.context = context;
} @Override
public int getCount() {
return list.size();
} @Override
public Object getItem(int position) {
return list.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if(convertView == null)
{
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.listview_item, null, false);
TextView tv1= (TextView) convertView.findViewById(R.id.tvTitle);
viewHolder.tv = tv1;
convertView.setTag(viewHolder);
}
else
{
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.tv.setText(list.get(position));
return convertView;
} class ViewHolder{
public TextView tv;
}
}
主Activity代码:
package com.example.testlistview; import java.util.ArrayList;
import java.util.List; import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.TextView; public class MainActivity extends Activity implements OnScrollListener{ private int pageIndex = 1;
private int pageSize = 2;
private int pageCount = 2;//初始设置页数为2,因为刚开始不知道总页数
private CornerListView listView;
private CornerAdapter adapter;
private View footer,tvMsg,loading;
private boolean is_divPage = false;//是否分页
private List<String> list = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (CornerListView) findViewById(R.id.list);
listView.setOnScrollListener(this);
footer = View.inflate(this, R.layout.more, null);
tvMsg = footer.findViewById(R.id.tv_msg);
loading = footer.findViewById(R.id.loading);
listView.addFooterView(footer);//添加footerview
Thread thread = new Thread(runnable);//第一次访问服务器接口,返回第一页信息,并确定总页数信息
thread.start();
} //异步访问网络加载数据之类的。。
Runnable runnable = new Runnable() { @Override
public void run() {
//传递pageIndex,pageSize,URL等参数访问网络获取数据,这里省略。。。
//doSomething
String strJson = "";//假定strJson就是服务器返回的这一页Json数据
//假设这里返回总页数为5
pageCount = 5;
Message msg = new Message();
msg.obj = strJson;
handler.sendMessage(msg);//将消息返回给UI }
}; //处理返回的消息,设置ListView
Handler handler = new Handler(){ @Override
public void handleMessage(Message msg) {
String strJson = msg.obj.toString();
//各种转换组合数据,这里我们就不做了,模拟一下数据
for(int i=0;i<pageSize; ++i)
{
if(adapter != null && adapter.list != null)//从获取第二页开始,直接修改适配器的list
{
adapter.list.add(i+"");
}
else//第一次适配器还没有构造
{
list.add(i+"");
}
}
if(pageIndex == 1)//第一次,设置适配器
{
adapter = new CornerAdapter(list, MainActivity.this);
listView.setAdapter(adapter);
//判断一下是否显示更多按钮
if(pageIndex == pageCount)
{
listView.removeFooterView(footer);
}
else if(pageIndex < pageCount)
{
//设置tvmsg显示,加载动画不显示
tvMsg.setVisibility(View.VISIBLE);
loading.setVisibility(View.GONE);
}
}
else
{
//直接调用方法更新数据
adapter.notifyDataSetChanged();
if(pageIndex == pageCount)
{
listView.removeFooterView(footer);
}
else if(pageIndex < pageCount)
{
//设置tvmsg显示,加载动画不显示
tvMsg.setVisibility(View.VISIBLE);
loading.setVisibility(View.GONE);
}
} } }; @Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
//需要分页,触摸停止,当前确实还有分页数据
if(is_divPage && scrollState == OnScrollListener.SCROLL_STATE_IDLE && pageIndex < pageCount)
{
pageIndex += 1;//设置请求当前页码加1
Thread thread = new Thread(runnable);
thread.start();
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//现在 Bug初始情况下向下滑动也能翻页
int lastVisibleItem = firstVisibleItem + visibleItemCount;//当前滑动到最后一项
if(lastVisibleItem == totalItemCount && totalItemCount > 0)
{
is_divPage = true;
}
}
}
Android ListView分页,动态添加数据的更多相关文章
- android ListView 分页加载数据
1.mainActivity <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ...
- Android之ListView动态添加数据(SQLiteOpenHelper类添加数据)
一.SQLiteOpenHelper类: 这次我们通过sqlite来动态添加数据,接下来我们创建一个openHelper.java,在前面sqlite博客中我们已经详细的讲了SQLite的创建及使用等 ...
- Android中ListView分页加载数据
public class MainActivity extends Activity { private ListView listView=null; //listview的数据填充器 privat ...
- 【Android进阶】Listview分页加载数据的实现
Listview分页加载数据的实现 public class MainActivity extends Activity { protected static final int SUCCESS_GE ...
- Android --ListView分页
参考博客:Android ListView分页加载(服务端+android端)Demo 监听OnScrollListener事件 class OnListScrollListener implemen ...
- Android ListView分页载入(服务端+android端)Demo
Android ListView分页载入功能 在实际开发中经经常使用到,是每一个开发人员必须掌握的内容,本Demo给出了服务端+Android端的两者的代码,并成功通过了測试. 服务端使用MyEcli ...
- 关于devexpress报表XtraReport,动态修改报表样式(.repx格式),动态添加数据并使用的理解
一.基本概念: XtraReports 中的每个报表都由 XtraRepot 类的一个实例表示,或者由该类的子类来表示(这种情况更常见). 因此,每个报表都作为带区的容器使用,而每个带区中都包含报表控 ...
- js表单动态添加数据并提交
情景1:已经存在form对象了,动态为form增加对象并提交 function formAppendSubmit(){ var myform=$('#newArticleForm'); //得到for ...
- 【javascript 动态添加数据到 HTML 页面】
今天简单的学习了一下有关对象字面量的定义和 javascript 如何取出对象字面量的值的知识,javascript 动态添加数据到 HTML 页面的问题. [学习目标]有如下的一组数据通过 Ajax ...
- 第27讲 UI组件之 ScrollView与底部动态添加数据
第27讲 UI组件之 ScrollView与底部动态添加数据 1. ScrollView(滚动视图) ScrollView(滚动视图)是实现滚动的一个控件,只需要将需要滚动的控件添加到ScrollVi ...
随机推荐
- docker 阿里云镜像加速器
传送门:阿里云镜像地址 Ubuntu/CentOS 安装/升级你的Docker客户端 推荐安装1..0以上版本的Docker客户端,参考文档 docker-ce 如何配置镜像加速器 针对Docker客 ...
- img元素srcset属性浅析
img srcset 属性 img 元素的 srcset 属性用于浏览器根据宽.高和像素密度来加载相应的图片资源. 属性格式:图片地址 宽度描述w 像素密度描述x,多个资源之间用逗号分隔.例如: &l ...
- CentOS6.8下安装Docker
原文章链接https://www.cnblogs.com/baolong/p/5743420.html. 由于在自己安装的虚拟机上打开linux终端命令行输入uname -a 以及cat /etc/r ...
- Vutrl 自己搞SS的些问题
虽然是第二次搞这玩意但还是搞了我三天,有些东西还是想要记录一下的,以下是我犯的错误 至于如何开始搭建Vutrl上面的服务器,下面有两个链接自己搞,我就讲讲我自己碰到的问题 https://segmen ...
- 完善的IaaS云服务的个人理解
此文已由作者王盼授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 前情提要 本文仅讨论云主机(虚拟机).云硬盘(块存储).云网络(普通虚拟网络或SDN)相关的IaaS服务,相关 ...
- python和shell获取命令行参数的区别
一.命令行参数的取得对于一些功能性的脚本来说非常有用,不至于将功能写死在脚本中. shell的命令行参数直接用 $ 1,$2 等就可以直接获取 其中 $1 表示 第二个参数,即命令行的第一个参数,因为 ...
- 【ITOO 3】.NET 动态建库建表:实用EF框架提供的codeFirst实现动态建库
导读:在上篇博客中,介绍了使用SQL字符拼接的方式,实现动态建库建表的方法.这样做虽然也能够实现效果,但是,太麻烦,而且,如果改动表结构,字段的话,会对代码修改很多.但是EF给我们提供了一种代码先行的 ...
- google的三篇论文
文章:MapReduce/GFS/BigTable三大技术资料 文章:Google File System(中文翻译) 文章:MapReduce:超大机群上的简单数据处理 文章:Google's Bi ...
- poj 3417 Network 题解
题意: 先给出一棵树,然后再给出m条边,把这m条边连上,然后剪掉两条边,一条是原边,一条是新边,问有多少种方案能使图不连通. 思路: 从原边的角度看 1.树加边,一定成环,加一条(u,v)边就有u-& ...
- POJ3621 Sightseeing Cows【最短路】
题目大意:在一个无向图里找一个环,是的点权和除以边权和最大 思路:UVA11090姊妹题 事实上当这题点权和都为1时就是上一题TUT #include <stdio.h> #include ...