ListView 分段加载更新实例
ListView是android中最常用的控件之一。
在实际运用中往往会遇到一次性加载全部数据过多,需要分页加载增加程序运行效率!
本demo是将更新的监听放在listview的foot中,通过底部按钮点击触发或者通过滑动事件监听,当滑动到列表最底部的时候触发。
有图有真像:
列表初始状态
触发加载
加载后
部分代码:
MainActivity
private void initActivity() { // TODO Auto-generated method stub loadMoreView = getLayoutInflater().inflate(R.layout.loadmore, null); loadmore_btn = (Button) loadMoreView.findViewById(R.id.loadmore_btn); loadmore_btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub doUpdate(); } }); listView = (ListView) findViewById(R.id.listView); listView.addFooterView(loadMoreView); initAdapter(); listView.setAdapter(adapter); listView.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // TODO Auto-generated method stub int itemsLastIndex = adapter.getCount() - 1; int lastIndex = itemsLastIndex + 1; if (scrollState == OnScrollListener.SCROLL_STATE_IDLE && visibleLast == lastIndex) { // 可在这添加滑到列表底的时候异步自动加载 // doUpdate(); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { // TODO Auto-generated method stub visibleCount = visibleItemCount; visibleLast = firstVisibleItem + visibleItemCount - 1; } }); } protected void doUpdate() { // TODO Auto-generated method stub loadmore_btn.setText("loading ..."); handler.postDelayed(new Runnable() { @Override public void run() { // TODO Auto-generated method stub loadData(); adapter.notifyDataSetChanged();// 通知adapter数据变化 listView.setSelection(visibleLast - visibleCount + 1); loadmore_btn.setText("Load More"); } }, 2000); } private void loadData() { // TODO Auto-generated method stub int count = adapter.getCount(); for (int i = count; i < count + 10; i++) { adapter.addItem(String.valueOf(i + 1)); } } private void initAdapter() { // TODO Auto-generated method stub List<String> items = new ArrayList<String>(); for (int i = 0; i < 10; i++) { items.add(String.valueOf(i + 1)); } adapter = new ListAdapter(this, items); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; }
ListAdapter
public ListAdapter(Context context, List<String> items) { this.items = items; this.inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { // TODO Auto-generated method stub return items.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return items.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub if (convertView == null) { convertView = inflater.inflate(R.layout.list_item, null); } TextView textView = (TextView) convertView .findViewById(R.id.list_item_text); textView.setText(items.get(position)); return convertView; } /** * 添加列表项 * @param item */ public void addItem(String item){ items.add(item); }
提醒一下:要下载android-support-v4.jar 这个第三方的jar包哦! 这里就不提供下载了!
源码下载:LoadMore.rar
标签:
android开发
, Listview 分段加载
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构