android分页加载数据
⑴ android如何能从服务器中一次性加载所有数据,而不是分页加载
当你向服务器请求数据后,返回的是否是所有数据取决于服务器端怎么处理,分页一般分2种,一种是在服务器端处理,每点下一页则需发送一次请求,一种是在客户端中,一次请求服务器返回所有的数据给你,然后你在本地解析后有这个对象,在对这个数据对象进行处理
⑵ 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="http://schemas.android.com/apk/res/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 List<Map<String, 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 List<Map<String, 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 listview加载很多数据的时候,肯定不能一次性全部添加到item里把。 怎么做分页呢
网络搜索ListView分页即可,
这种通用的问题直接网络搜索就行,更快更准
⑷ 如何实现listview分页加载
<?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" >
<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="http://schemas.android.com/apk/res/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 ArrayList<HashMap<String,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 ArrayList<HashMap<String,String>>();
for (int i = 0; i < 10; i++) {
HashMap<String, String> map = new HashMap<String, 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++) {
HashMap<String, String> map = new HashMap<String, String>();
map.put("ItemTitle", "新增第" + i + "行标题");
map.put("ItemText", "新增第" + i + "行内容");
list.add(map);
}
} else {
// 数据已经不足5条
for (int i = count; i < MaxDateNum; i++) {
HashMap<String, String> map = new HashMap<String, 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 listview 分页加载动态数据:通过json获取了100条数据,如何将这一百条数据分页显示
自定义adapter 定义一个页码数,每页item数量 getcount返回为每页item数量
getitem返回为 (页码数-1)*每页item数量 +position的那条数据
然后getview方法的数据加载同理 然后给两个按钮 当点击上一页或者下一页的时候 就改变页码数 然后调用 adapter.notifyDataSetChanged() 大概思路 可能哪里要稍微改一下
⑹ android listview 分页显示加载第二页之后怎么是从第一条开始显示的
你要显示的数据应该是保存在一个List集合里的,只需要把新查询出的数据加入到原本数据的集合中,在调用adapter.notifyDataSetChange()方法就可以了。
估计你是用第二页的数据替换带第一页的数据了或是把第二页的数据放到集合前面了。
⑺ 我是Android新手 最近listview做分页加载遇到了问题 加载更多的时候从服务器请求数据怎
请求服务器,每次10条
推荐使用pullrefreshlistview或其他具备上拉加载更多,下拉刷新的功能
第一次启动pullrefreshlistview后,默认加载10条,手势上拉重新发送请求,同理,下拉重新请求服务器
获取每次10条数据后,调用notifyDataSetChanged刷新列表,完成分页请求,推荐阅读——
Android开发之ListView添加多种布局效果演示
⑻ android的分批加载是怎么实现的
每次滑动至底端,从数据库中获取10条数据,并加载于ListView中
数据库
package com.example.listviewbatchloading;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class PersonDb extends SQLiteOpenHelper {
public PersonDb(Context context) {
super(context, "creature", null, 1);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("create table people(_id integer primary key autoincrement,name char,number char)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("drop table people");
onCreate(db);
}
}
数据库的业务封装,其中获取更多数据的是核心代码
package com.example.listviewbatchloading;
/**
* 数据库的业务封装类
*/
import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
public class PersonList {
PersonDb personDb;
public PersonList(Context context){
this.personDb = new PersonDb(context);
}
/**
* 获取一定条目的数据
* @param startIndex
* 开始取数据的位置
* @param num
* 取多少条数据
*/
public List<Person> getMoreDatas(int startIndex,int num){
List<Person> list = new ArrayList<Person>();
SQLiteDatabase db = personDb.getWritableDatabase();
Cursor cursor = db.rawQuery("select name,number from people order by _id desc limit ?,?",
new String[]{startIndex + "",num + ""});
while(cursor.moveToNext()){
Person person = new Person();
person.setName(cursor.getString(cursor.getColumnIndex("name")));
person.setNumber(cursor.getString(cursor.getColumnIndex("number")));
list.add(person);
}
cursor.close();
db.close();
return list;
}
/**
* 添加数据库条目
* @param name
* @param number
*/
public void add(String name,String number){
SQLiteDatabase db = personDb.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put("name", name);
cv.put("number", number);
db.insert("people", null, cv);
db.close();
}
}
功能实现
package com.example.listviewbatchloading;
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.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private ListView lv ;
private List<Person> datas = new ArrayList<Person>();
private static int PERPAGE = 10; //每页加载数目
private static final int FINISH = 0;//数据加载完成
private List<Person> moreDatas;//每次加载的数据
private MyAdapter adapter;
private PersonList personList ;
//若数据较多,耗时较长,数据加载完成时,发送FINISH至handler,并通知ListView更新数据
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case FINISH:
if (moreDatas.size() != 0) {
System.out.println(moreDatas.toString());
adapter.notifyDataSetChanged();
}else {
Toast.makeText(MainActivity.this, "没有更多数据", Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
initEvent();
}
/**
* 为ListView添加滚动监听事件,但滚动至最后一行时,加载更多数据
*/
private void initEvent() {
lv.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
int lastVisiblePosition = lv.getLastVisiblePosition();
if (lastVisiblePosition == datas.size() - 1) {
initData();
System.out.println("加载更多数据");
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
}
});
}
private void initView() {
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
personList = new PersonList(getApplicationContext());
adapter = new MyAdapter();
lv.setAdapter(adapter);
}
/**
* 在子线程中加载数据,避免主线程阻塞
*/
private void initData() {
new Thread() {
public void run() {
// 加载更多数据
moreDatas = personList.getMoreDatas(datas.size(), PERPAGE);
datas.addAll(moreDatas);// 把一个容器的所有数据加进来
// 取数据完成,发消息通知取数据完成
handler.obtainMessage(FINISH).sendToTarget();
};
}.start();
}
private class ItemView{
private TextView tv_name;
private TextView tv_num;
}
/**
* ListView的适配器
* @author lian
*
*/
private class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return datas.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ItemView itemView = null;
if (convertView == null) {
itemView = new ItemView();
convertView = View.inflate(getApplicationContext(), R.layout.item_lv, null);
itemView.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
itemView.tv_num = (TextView) convertView.findViewById(R.id.tv_num);
convertView.setTag(itemView);
}else {
itemView = (ItemView) convertView.getTag();
}
Person person = datas.get(position);
itemView.tv_name.setText(person.getName());
itemView.tv_num.setText(person.getNumber());
return convertView;
}
}
}
⑼ Android培训课程有什么内容
第一阶段的课程一般都是Java编程开发
这一部分应该会和Java后台有相关联的地方,但是比Java后台简单,这一阶段一般要学习Java语法和Java面向对象思想、Java数据结构及算法、GUI界面编程、Java进程与线程、Java网络通信与流、设计模式、数据库和Javaweb,安卓在这一阶段的学习内容看似和后台关联性很大,但是这一部分我们只学习后台一些基础的东西和日后会用到的东西,我们要把基础奠定好。
第二阶段要学习的内容是安卓基础开发
主要的课程内容为Android界面编程(界面编程是Android入门的核心技术,内容纵多,涉及四大组件之一Activity、Wedget、自定义View、事件处理、动画处理、列表、图片处理、国际化、资源文件、菜单、通知、对话框、Tools/ActionBar/Fragment、样式/主题、Intent。)、进程与线程、服务与广播、数据存储、网络通信、多媒体以及硬件相关,这一阶段更注重安卓入门基础的培训,一定要好好的把握。
接下来学习的内容是一个进阶阶段,主要学习的是安卓的高级开发,一般的课程内容为HOME开发、NDK开发等、地图开发项目发布等等,以上就算是安卓培训的所有学习内容,但是你掌握了学习内容之后还是远远不够的,一般的培训班都会给我们安排项目实战的,这是一种思想的锻炼,我们做什么就要有什么的思维做后台的有做后台的思维,做前端的有做前端的思维,我们学安卓的进行手机端APP开发的就要有安卓的思维,这一阶段也是很重要的,就好比我们在华清远见学完整体的内容之后也参与了一些项目的实战。
我把每一阶段要学习的课程都给你整理了,你可以现在有准备的去看一些基础的视频或者相关的书籍了。
安卓培训视频资料都有
⑽ Android listview分页加载数据后,总是回滚到顶部,应该怎么防止其回滚到顶部
listview.setSelection(listview.getCount() - 1); 这句没必要填吧. notifyDataSetChanged();就可以了, 刷新数据是不会出现回到顶部的情况. 还有getCount()在adapter中是多次执行的, 你打下log看一看就知道了.