首页 > 其他分享 >Listview中使用线程实现无限加载更多项目的功能

Listview中使用线程实现无限加载更多项目的功能

时间:2022-12-02 13:00:51浏览次数:31  
标签:listview Thread int loadMoreListItems 线程 new android Listview 加载


在现在的SINA微博或者象twitter,dzone等网站中,当加载一个很长的列表时,往往都是
先加载部分内容,然后当用户用拖拉条往下拖动时,再加载更多的内容.这里在android
中,可以用listview搭配线程实现同样的功能,举例如下:

1)首先设置footer部分,即在listview的下面设置footview,
footview的模版如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:gravity="center_horizontal"
android:padding="3dp"
android:layout_height="fill_parent">

<TextView
android:id="@id/android:empty"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:gravity="center"
android:padding="5dp"
android:text="Loading more days..."/>

</LinearLayout>

然后记得在加到adapter前,把footview加到listview中去
View footerView = ((LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.listfooter, null, false);

this.getListView().addFooterView(footerView);

this.setListAdapter(adapter);

然后,listview的onscroll方法如下:

this.getListView().setOnScrollListener(new OnScrollListener(){


public void onScrollStateChanged(AbsListView view, int scrollState) {}


public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {


int lastInScreen = firstVisibleItem + visibleItemCount;
String last=Integer.toString(lastInScreen);
Log.d("show",last);
String total=Integer.toString(totalItemCount);
Log.d("total",total);

if((lastInScreen == totalItemCount) && !(loadingMore)){
Thread thread = new Thread(null, loadMoreListItems);
thread.start();
}
}
});



Thread thread = new Thread(null, loadMoreListItems);
thread.start();


下面来分析下,其中,可以预先设置一个屏的listview能显示多少条记录,比如设置为5条,


这里itemsPerPage=15,然后首先


int lastInScreen = firstVisibleItem + visibleItemCount;


这里,获得每屏中最后一条数据的位置,比如一次先显示5条,则lastInScreen=5了,



if((lastInScreen == totalItemCount) && !(loadingMore)){


Thread thread = new Thread(null, loadMoreListItems);


thread.start();


}


这里是判断,如果是滚动了滚动条,并且用户以及功能浏览完了一次屏幕所需要的数目(比如5个),则启用线程序loadMoreListItems去处理,加载另外的新的5个了.


而如果没滚动,则第一次显示时,也要启用线程序loadMoreListItems去处理.


.


下面看loadMoreListItems.



private Runnable loadMoreListItems = new Runnable() {     

public void run() {
loadingMore = true;

myListItems = new ArrayList<String>();

//Simulate a delay, delete this on a production environment!
try { Thread.sleep(1000);
} catch (InterruptedException e) {}

//Get 15 new listitems
for (int i = 0; i < itemsPerPage; i++) {

myListItems.add("Date: " + (d.get(Calendar.MONTH)+ 1) + "/" + d.get(Calendar.DATE) + "/" + d.get(Calendar.YEAR) ); d.add(Calendar.DATE, 1);

}

runOnUiThread(returnRes);

}
};




在这个线程里,实际上就是用循环往listview中加日期,产生从当天时间起的若干个日期格式,然后调用 runOnUiThread(returnRes);去更新UI主线程,注意 runOnUiThread是


android提供的方法,可以帮助你在线程中执行UI更新操作.



private Runnable returnRes = new Runnable() {

public void run() {

if(myListItems != null && myListItems.size() > 0){
for(int i=0;i<myListItems.size();i++)
adapter.add(myListItems.get(i));
}


adapter.notifyDataSetChanged();

loadingMore = false;
}
};


在更新主线程中,十分简单,只不过往adapter中去增加元素,并且notifyDataSetChanged通知listview起变化了,并设置loadingMore=false,因为已经加载完了一次了.


标签:listview,Thread,int,loadMoreListItems,线程,new,android,Listview,加载
From: https://blog.51cto.com/u_14230175/5906953

相关文章

  • Redis中的单线程多路复用的一个通俗解析
    在尚学堂的课程中,有个不错的单线程多路复用的通俗解析,觉得不错:其实就是黄牛买票,黄牛是单线程了,但他能服务很多买票的人,买票的人也不需要去等待的 ......
  • Bootstrap tab页的动态ajax加载
    要实现这样的功能,点击tab导航ajax动态加载页面,当加载过之后,点击则不再重新加载,直接显示原来加载的页面。tab页面代码:<!--Navtabs--><ulclass="......
  • cakephp中加载第三方类的一点注意的
    在cakephp中,加载其他不相关的类,有三种方法,例子如下:<?phpclassTasksControllerextendsAppController{var$name='Tasks';functionin......
  • jquery判断图片是否完整加载了
    这里其实是个tips,目的是判断每张图片是否能正确完整加载了:(document).ready(function(){$('img').error(function(){ $.post('ajax-image......
  • Android实验——ListView的使用
    一、实验要求和目的掌握Android中ListView控件的使用;掌握各种Adapter封装数据的方法;能够熟练应用各种布局管理器和控件进行界面设计。二、实验环境部署有AndroidS......
  • 多线程锁等待超时解决方案
    java.util.concurrent.ExecutionException:org.springframework.dao.CannotAcquireLockException:###Errorupdatingdatabase.Cause:com.mysql.cj.jdbc.exception......
  • 如何创建线程
    在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程。当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通使用的,需要在实践中不......
  • 多线程加锁之后不就是单线程了吗
    突然灵机一动想到:多线程加锁之后不就是单线程了吗,其实在学java的时候老师应该有讲过,但是都忘记了。Q: 多线程lock之后不就是单线程了吗?答:lock并不需要锁定所有的操作......
  • SpringBoot找不到或无法加载主类
    首先确认程序的启动类中springboot类的名字没写错。确认之后在idea中依旧有下边的错误信息            ......
  • java 中类的加载顺序
    JAVA类首次装入时,会对静态成员变量或方法进行一次初始化,但方法不被调用是不会执行的;静态成员变量和静态初始化块级别相同,非静态成员变量和非静态初始化块级别相同。先初始......