在使用ListView时,会遇到当ListView列表滑动到最底端时,添加新的列表项的问题,本文通过代码演示如何动态的添加新的列表项到ListView中。
实现步骤:调用ListView的setOnScrollListener()方法设置滑动监听器,实现OnScrollListener接口的方法,判断当列表滑动到最低端时,加载新的列表项。
其中OnScrollListener接口需要实现如下两个方法:
onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
view 报告滑动状态的视图
firstVisibleItem 可视的第一个列表项的索引
visibleItemCount 可视的列表项个数
totalItemCount 总共的列表项个数
onScrollStateChanged(AbsListView view, int scrollState)
view 报告滑动状态的视图
scrollState 滑动状态
滑动状态包括
SCROLL_STATE_IDLE : 0 视图没有滑动
SCROLL_STATE_TOUCH_SCROLL : 1 用户正在触摸滑动,手指仍在屏幕上
SCROLL_STATE_FLING : 2 用户之前触摸滑动,现在正在滑行,直到停止
下面通过代码给大家演示效果

[java] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <ListView
  8. android:id="@id/android:list"
  9. android:layout_width="match_parent"
  10. android:layout_height="match_parent"
  11. android:layout_weight="1"
  12. android:drawSelectorOnTop="false"
  13. />
  14. </LinearLayout>
[java] view plaincopy
  1. // footer.xml
[java] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="wrap_content"
  5. android:gravity="center"
  6. android:orientation="horizontal"
  7. >
  8. <ProgressBar
  9. android:id="@+id/progressbar"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. style="\?android:attr/progressBarStyleSmall"
  13. />
  14. <TextView
  15. android:layout_width="wrap_content"
  16. android:layout_height="wrap_content"
  17. android:textSize="20.0sp"
  18. android:text="正在加载..."
  19. />
  20. </LinearLayout>

然后是主代码:

[java] view plaincopy
  1. public class MainActivity extends ListActivity
  2. {
  3. private ListView mListView;
  4. private CustomAdapter mAdapter;
  5. private int mScrollState;
  6. private View mFooter;
  7. @Override
  8. public void onCreate(Bundle savedInstanceState)
  9. {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.main);
  12. //获取ListView
  13. mListView = getListView();
  14. //根据footer.xml描述创建View
  15. mFooter = getLayoutInflater().inflate(R.layout.footer, null);
  16. // 在ListView底部添加正在加载视图
  17. //注意:addFooterView方法需要在调用setListAdapter方法前调用!
  18. mListView.addFooterView(mFooter);
  19. mAdapter = new CustomAdapter();
  20. setListAdapter(mAdapter);
  21. //给ListView添加滚动监听器
  22. mListView.setOnScrollListener(new AbsListView.OnScrollListener()
  23. {
  24. @Override
  25. public void onScrollStateChanged(AbsListView view, int scrollState)
  26. {
  27. //记录当前状态
  28. mScrollState = scrollState;
  29. }
  30. @Override
  31. public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
  32. {
  33. // 可视的最后一个列表项的索引
  34. int lastVisibleItem = firstVisibleItem + visibleItemCount - 1;
  35. //当列表正处于滑动状态且滑动到列表底部时,执行
  36. if (mScrollState != AbsListView.OnScrollListener.SCROLL_STATE_IDLE
  37. && lastVisibleItem == totalItemCount - 1)
  38. {
  39. // 执行线程,模拟睡眠5秒钟后添加10个列表项
  40. new Thread()
  41. {
  42. private Handler handler = new Handler()
  43. {
  44. @Override
  45. public void handleMessage(Message msg)
  46. {
  47. super.handleMessage(msg);
  48. //增加Item数量
  49. mAdapter.count += 10;
  50. //通知数据集变化
  51. mAdapter.notifyDataSetChanged();
  52. }
  53. };
  54. @Override
  55. public void run()
  56. {
  57. super.run();
  58. try
  59. {
  60. sleep(5000);
  61. handler.sendEmptyMessage(0);
  62. } catch (InterruptedException e)
  63. {
  64. e.printStackTrace();
  65. }
  66. }
  67. }.start();
  68. }
  69. }
  70. });
  71. }
  72. private class CustomAdapter extends BaseAdapter
  73. {
  74. // 初始列表项数量
  75. int count = 20;
  76. @Override
  77. public int getCount()
  78. {
  79. return count;
  80. }
  81. @Override
  82. public Object getItem(int position)
  83. {
  84. return position;
  85. }
  86. @Override
  87. public long getItemId(int position)
  88. {
  89. return position;
  90. }
  91. @Override
  92. public View getView(int position, View convertView, ViewGroup parent)
  93. {
  94. TextView result = (TextView) convertView;
  95. //动态创建TextView添加早ListView中
  96. if (result == null)
  97. {
  98. result = new TextView(MainActivity.this);
  99. result.setTextAppearance(MainActivity.this, android.R.style.TextAppearance_Large);
  100. AbsListView.LayoutParams layoutParams = new AbsListView.LayoutParams
  101. (AbsListView.LayoutParams.FILL_PARENT,
  102. AbsListView.LayoutParams.WRAP_CONTENT);
  103. result.setLayoutParams(layoutParams);
  104. result.setGravity(Gravity.CENTER);
  105. }
  106. result.setText("第 " + (position + 1)+"行");
  107. return result;
  108. }
  109. }
  110. }
[java] view plaincopy
  1. 效果预览

Android中动态更新ListView相关推荐

  1. Android中动态生成ListView及SimpleAdapter的使用

    SimpleAdapter是扩展性最好的适配器,可以定义各种你想要的布局,而且使用很方便 SimpleAdapter(Context context, List<? extends Map< ...

  2. android asynctask源码分析,Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)...

    本文实例讲述了Android通过Handler与AsyncTask两种方式动态更新ListView的方法.分享给大家供大家参考,具体如下: 有时候我们需要修改已经生成的列表,添加或者修改数据,noti ...

  3. 一步步教你为网站开发Android客户端---HttpWatch抓包,HttpClient模拟POST请求,Jsoup解析HTML代码,动态更新ListView...

    本文面向Android初级开发者,有一定的Java和Android知识即可. 文章覆盖知识点:HttpWatch抓包,HttpClient模拟POST请求,Jsoup解析HTML代码,动态更新List ...

  4. notifyDataSetChanged() 动态更新ListView

    有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView.今 ...

  5. Android中动态初始化布局参数以及ConstraintLayout使用中遇到的坑

    Android中动态初始化布局以及ConstraintLayout遇到的一个坑 ConstraintLayout是Android中的一个很强大的布局,它通过控件之间的相对定位,来完成一个layout中 ...

  6. android radiogroup 添加,如何在android中动态添加textview到radiogroup

    大家好, 我们想动态地在radiogroup旁边添加textview.基于服务响应,我们需要在不使用xml的情况下将标签添加到radiogroup. 在某些情况下基于最长无线电如何在android中动 ...

  7. android中ScrollView嵌套ListView或GridView显示位置问题

    Android中ScrollView中嵌套ListView或GridView时在开始进入界面时总是显示中间位置,开头的位置显示不出来.这种情况下只需要在ScrollView的父控件中添加以下两行代码即 ...

  8. Android中动态的更改selector中某张图片的属性

    在我们平常开发的时候会有许多状态按钮,比如state_pressed,android:state_checked,或者就正常状态等等,我们做这样的效果通常需要三个文件,一张是按下的图片,一张是正常状态 ...

  9. Android 中动态的向布局中添加控件

    先看一下效果图: 注: 这里使用的是一个自定义的布局文件,你可以向这个布局文件中添加任何控件,它也会动态的依据控件 的大小,动态的排列控件的分布 注:这里使用到的更新界面的方法:http://blog ...

最新文章

  1. Swift Tips - 在 Swift 中自定义下标访问
  2. [云炬创业基础笔记]第六章商业模式测试24
  3. SOCKET编程中,select()函数的作用
  4. mysql查看是否开启定时器_Mysql 查看定时器 打开定时器 设置定时器时间
  5. Python黑帽编程 3.4 跨越VLAN
  6. 信息的哲学--从信息到数据存储,再到数据保护
  7. 国内5家云服务厂商 HTTPS 安全性测试横向对比
  8. HTTP访问控制(CORS)踩坑小记
  9. HikariDataSource 配置详解
  10. SpringBoot 与 Kotlin 完美交融
  11. gitee免费部署静态网站
  12. python获取键盘按键键值_python获取键值
  13. android 内存至少一半,极客修:为什么iPhone比安卓内存小,却更流畅?
  14. ‘parent.relativePath‘ points at com.xxx instead of org.springframework.boot:spring-boot-starter的快速解决
  15. Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析 (iic驱动框架,i2c驱动框架)...
  16. 【快速检索,稳定出版,强大委员会Speaker阵容】ICCCS 2022|第7届通信计算机大会
  17. 液体点滴速度监控报警装置(51单片机)
  18. ZOJ 4062 Plants vs. Zombies(二分)
  19. inkscape制作向日葵
  20. (二)第二部分:Linux下HTTP服务器的搭建

热门文章

  1. 【Flutter】FutureBuilder 异步编程 ( FutureBuilder 构造方法 | AsyncSnapshot 异步计算 )
  2. 【Android 插件化】“ 插桩式 “ 插件化框架 ( 代理 Activity 组件开发 )
  3. 【Android APT】注解处理器 ( 根据注解生成 Java 代码 )
  4. 【Android 异步操作】Handler ( 主线程中的 Handler 与 Looper | Handler 原理简介 )
  5. 用WORD2010写博客,并发送至博客园
  6. [CQOI2018] 异或序列
  7. Android加载大图片(压缩)
  8. 【在还原SQL Server数据库时发生对于服务器“XXX”操作系统错误】很实用的解决方案...
  9. 五大HR所不认同的跳槽理由(转)
  10. 运动学与雅可比矩阵举例