我有大约10000行数据的在线数据库。我想从服务器下载这个数据到客户端Android应用程序。但是一次下载整个数据需要很长时间,所以我想先获取5行,然后接下来5行,依此类推。此外,我不知道如何动态更新我的listView与第2,第3 ...时间动态获取数据。任何人都可以帮助我??
答案 0 :(得分:0)
您可以使用asynctask将数据请求到while循环,直到下载所有数据。服务器必须接受间隔请求 伪代码doInBackground:
int response = 0;
int start = 0;
end = 10;
while (reponse != -1){
//conect to server and request data from start to end
List<items> list = requestServer(start, end);
if (list != null){
publishProgress(list);
responmse = -1;
} else {
start += 10;
end += 10;
}
}
伪代码onProgressUpdate:
// just update and refresh ListAdapter
答案 1 :(得分:0)
假设您有一个php getdata.php
文件来提供数据。
<?php
$limit = 5;
$offset = $_GET["page"] * $limit;
//database query string
$sql = "SELECT * FROM myTable LIMIT " . $limit . " OFFSET " . $offset;
//make db connection and print results as json
//TODO
?>
将此EndLessListView复制到您的项目中:
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.AbsListView;
/**
* Created by ozgur on 11/3/15 at 4:48 PM.
*/
public class EndlessListView extends android.widget.ListView implements AbsListView.OnScrollListener {
private boolean inEndOfList = false;
private ListViewListener listViewListener;
public ListView(Context context) {
super(context);
init(context);
}
public ListView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public ListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
@Override
public void onScrollStateChanged(AbsListView absListView, int scrollState) {
}
@Override
public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int tot = firstVisibleItem + visibleItemCount;
if(tot >= totalItemCount) {
if(!inEndOfList) {
inEndOfList = true;
if(listViewListener != null)
listViewListener.onEndOfList();
}
} else
inEndOfList = false;
}
private void init(Context context) {
this.setOnScrollListener(this);
}
public void setListViewListener(ListViewListener listViewListener) {
this.listViewListener = listViewListener;
}
public interface ListViewListener {
void onEndOfList() ;
}
}
用活动的XML中的上面的EndlessListView替换你的ListView。
private EndlessListView listView;
private int currentPage = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getData();
listView = (EndlessListView) findViewById(R.id.listView);
listView.setListViewListener(new ListViewListener() {
@Override
public void onEndOfList(){
currentPage++;
getData();
}
})
}
private void getData() {
//connect to getdata.php and send "currentPage" variable as "page" parameter
//add results to listView's data list
//notifyDataSetChanged your adapter
}