在chunck中从服务器获取数据并动态地适应listview

时间:2016-06-09 08:40:36

标签: php android database parsing

我有大约10000行数据的在线数据库。我想从服务器下载这个数据到客户端Android应用程序。但是一次下载整个数据需要很长时间,所以我想先获取5行,然后接下来5行,依此类推。此外,我不知道如何动态更新我的listView与第2,第3 ...时间动态获取数据。任何人都可以帮助我??

2 个答案:

答案 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 
}