Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
困在Android中实现分页_Android - Fatal编程技术网

困在Android中实现分页

困在Android中实现分页,android,Android,我正在Android中为ListView实现分页。我正在扩展BaseAdapater类来定制ListView 我已经有了用于定制ListView的代码。 以下是新的要求 1> 我正在从服务器获取6个项目并显示它们。现在,当用户滚动到第6项(列表末尾)时,我需要调用服务器获取接下来的6项并更新Listview 我已经重写了这些方法 i> public void onScroll(AbsListView视图、int firstVisibleItem、int visibleItemCount、int

我正在Android中为ListView实现分页。我正在扩展BaseAdapater类来定制ListView

我已经有了用于定制ListView的代码。 以下是新的要求

1> 我正在从服务器获取6个项目并显示它们。现在,当用户滚动到第6项(列表末尾)时,我需要调用服务器获取接下来的6项并更新Listview

我已经重写了这些方法

i> public void onScroll(AbsListView视图、int firstVisibleItem、int visibleItemCount、int totalItemCount)

ii>CrollStateChanged上的公共无效(AbsListView视图,int scrollState)

在服务器的第一个响应中,我从服务器获取总页数&每次调用服务器时,我都会获取当前的页值

请提供如何检查列表最后一项和更新列表的步骤/示例代码。代码应该是迭代的,因为我可能需要多次调用&从服务器获取

亲切问候,


CB

为什么不在后台下载,而不是每次有请求时都下载?我有一个应用程序,我曾考虑做同样的事情,你正在做,但决定用一个背景线程来代替它

下面是一个关于如何使用线程的好例子

我是如何实现它的,首先检索可用记录的总数,然后为要检索的每个“页面”记录启动一个新线程

// Create and launch the download thread
    downloadThread = new DownloadThread(this);
    downloadThread.start();

    // Create the Handler. It will implicitly bind to the Looper
    // that is internally created for this thread (since it is the UI
    // thread)
    handler = new Handler();

    resultCount = getResultCount(search).trim();
    resultsCount = Integer.parseInt(resultCount);
    page = 1;
    if (resultsCount > 0) {
        downloadThread
                .enqueueDownload(new DownloadTask(page));
    }
我在上面的示例中将检索记录的方法添加到DownloadTask.java中,并从run()调用它,然后添加了另一个公共方法来检索结果

我修改了DownloadThread.java,以便对任务的同步调用(DownloadTask)在DownloadTask>>task.run()中调用我的方法,并在{}中检索返回的结果

public synchronized void enqueueDownload(final DownloadTask task) {
    // Wrap DownloadTask into another Runnable to track the statistics
    handler.post(new Runnable() {
        @Override
        public void run() {
            try {
                task.run();
            } finally {                 
                // register task completion
                synchronized (DownloadThread.this) {
                    results = task.getResults();
                    totalCompleted++;
                }
                // tell the listener something has happened
                signalUpdate();
            }               
        }
    });
然后,我向DownloadThread.java添加了一个新方法,该方法允许我在活动中检索更新通知的结果

public synchronized ArrayList<Result> getResults() {
    return results;
}
public synchronized ArrayList getResults(){
返回结果;
}
例如,如果有60条记录,每个页面包含6条记录,我启动一个线程来检索前6条记录,然后在调用handleDownloadThreadUpdate()时,我用这些结果填充数组,并在适配器中调用调用调用notifyDataSetChanged()的名为update()的方法

public void handleDownloadThreadUpdate(){
handler.post(新的Runnable(){
@凌驾
公开募捐{
for(Result res:downloadThread.getResults()){
如果(!results.contains(res)){
结果:增加(实习医生(res));
}
}
arrayAdapter.update();
int pages=(int)Math.ceil(resultcount/6);
如果(第页<第页){
页码=页码+1;
下载线程。排队下载(新的下载任务(第页));
}
}
});
}
因此,它递归下载页面并将结果添加到我的列表中

还有一件事我忘了提。我有一个名为Result的类,它保存我存储在ArrayList中的每个结果。万一结果试图使用太多内存,我会将它们缓存在WeakReference HashMap中。。。正如您在上面的ArrayList中添加intern()时看到的调用

private Map<Result, WeakReference<Result>> myInternMap = new HashMap<Result, WeakReference<Result>>();

public Result intern(Result value) {
    synchronized (myInternMap) {
        WeakReference<Result> curRef = myInternMap.get(value);
        Result curValue = ((curRef != null) ? curRef.get() : null);
        if (curValue != null) {
            return curValue;
        }

        myInternMap.put(value, new WeakReference<Result>(value));
        return value;
    }
}
private Map myInternMap=new HashMap();
公开成绩实习生(成绩值){
已同步(myInternMap){
WeakReference curRef=myInternMap.get(值);
结果曲线值=((curRef!=null)?curRef.get():null);
if(曲线值!=null){
返回曲线值;
}
myInternMap.put(值,新WeakReference(值));
返回值;
}
}
private Map<Result, WeakReference<Result>> myInternMap = new HashMap<Result, WeakReference<Result>>();

public Result intern(Result value) {
    synchronized (myInternMap) {
        WeakReference<Result> curRef = myInternMap.get(value);
        Result curValue = ((curRef != null) ? curRef.get() : null);
        if (curValue != null) {
            return curValue;
        }

        myInternMap.put(value, new WeakReference<Result>(value));
        return value;
    }
}