困在Android中实现分页
我正在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) 在服务器的第一个响应中,我从服务器获取总页数&每次调用服务器时,我都会获取当前的页值 请提供如何检查列表最后一项和更新列表的步骤/示例代码。代码应该是迭代的,因为我可能需要多次调用&从服务器获取 亲切问候,困在Android中实现分页,android,Android,我正在Android中为ListView实现分页。我正在扩展BaseAdapater类来定制ListView 我已经有了用于定制ListView的代码。 以下是新的要求 1> 我正在从服务器获取6个项目并显示它们。现在,当用户滚动到第6项(列表末尾)时,我需要调用服务器获取接下来的6项并更新Listview 我已经重写了这些方法 i> public void onScroll(AbsListView视图、int firstVisibleItem、int visibleItemCount、int
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;
}
}