android ListView 滚动加载item

2023-11-10



悉Android的朋友们都知道,不管是微博客户端还是新闻客户端,都离不开列表组件,可以说列表组件是Android数据展现方面最重要的组件,我们今天就要讲一讲列表组件ListView加载数据的相关内容。通常来说,一个应用在展现大量数据时,不会将全部的可用数据都呈现给用户,因为这不管对于服务端还是客户端来说都是不小的压力,因此,很多应用都是采用分批次加载的形式来获取用户所需的数据。比如:微博客户端可能会在用户滑动至列表底端时自动加载下一页数据,也可能在底部放置一个“加载更多”按钮,用户点击后,加载下一页数据。

我们今天就结合实例来演示一下使用ListView获取数据的过程。

新建一个loadmore项目,我们来看一下结构图和最终效果图:



相关布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    
   <ListView
        android:id="@+id/listview_roll"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1.0" />

</LinearLayout>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <!-- 相关自定义控件 -->

    <TextView
        android:id="@+id/content"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
    </TextView>

</LinearLayout>

相关源代码:

package com.activity.gdbk;

import java.util.ArrayList;
import java.util.List;

import com.activity.gdbk.PageActivity.PageAdapter;
import com.activity.gdbk.PageActivity.ViewHolder;
import com.gdbk.dao.Bank;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

//滚动ListView 加载相关数据信息
public class RollActivity extends Activity implements Runnable {
	// 界面相关组件
	private ListView listView_roll;
	// 进度对话框
	private ProgressDialog progressDialog;
	// 自定义相关适配器
	private MyAdapter adapter;
	// ListView 数据常量定义
	private int LastItem = 0; // ListView 加载的最后item位置
	//MyAdapter 数据源
	List<Bank> banks = new ArrayList<Bank>();
	
	//创建RollActivity 界面的主线程
	private Handler handler=new Handler(){

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			switch(msg.what){
			//进行相关数据加载.....
			case 1:
				progressDialog.dismiss();  
				           for (int i = listView_roll.getCount(); i < listView_roll.getCount() + 10; ++i) {  
				        	   Bank item=new Bank();
				        	   item.setBank_name("湖南省光大银行**支行"+i);
				        	   banks.add(item);
				            }  
				             adapter.notifyDataSetChanged();  
				             //设置LastView  加载最后一项item的位置。
				             listView_roll.setSelection(LastItem - 1);  

				
				break;
			
			}
		}
		
		
	};

	@Override
	public void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		// 全屏显示
		this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);
		this.requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_roll);

		// 相关组件的初始化方法
		listView_roll = (ListView) findViewById(R.id.listview_roll);
		initializeAdapter();
		listView_roll.setAdapter(adapter);
		// ListView 实现OnScrollListener接口
		listView_roll.setOnScrollListener(new OnScrollListener() {

			@Override
			public void onScroll(AbsListView view, int firstVisibleItem,
					int visibleItemCount, int totalItemCount) {
				// TODO Auto-generated method stub
				LastItem = firstVisibleItem + visibleItemCount;
			}

			@Override
			public void onScrollStateChanged(AbsListView view, int scrollState) {
				// TODO Auto-generated method stub
				if (LastItem == adapter.getCount()
						&& scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
					// 执行数据异步加载的相关方法。
					LoadItems();
				}

			}

		});
	}

	// 自定义相关方法
	// adapter初始化方法----initializeAdapter()
	public void initializeAdapter() {
		
		for (int i = 1; i <= 10; i++) {
			Bank items = new Bank();
			items.setBank_name("湖南省光大银行**支行");
			banks.add(items);
		}
		adapter = new MyAdapter(banks);
	}

	// 自定义适配器----myAdapter
	public class MyAdapter extends BaseAdapter {
		// myAdapter 相关参数
		private List<Bank> data;

		// MyAdapter 构造函数
		public MyAdapter(List<Bank> data) {
			this.data = data;
		}

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return data.size();
		}

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return data.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
			// 加载相关布局文件
			ViewHolder holder = null;
			if (convertView == null) {
				convertView = getLayoutInflater().inflate(
						R.layout.listview_page_item, parent, false);
				holder = new ViewHolder();
				// 初始化相关控件
				holder.content = (TextView) convertView
						.findViewById(R.id.content);
				convertView.setTag(holder);
			} else {
				holder = (ViewHolder) convertView.getTag();
			}
			// 设置数据源信息
			holder.content.setText(data.get(position).getBank_name());

			return convertView;
		}

	}

	// 自定义 布局文件类----ViewHolder
	public class ViewHolder {
		private TextView content;
	}

	// 实现继承Runnable 接口覆写相关方法
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			Thread.sleep(3000);
			handler.sendEmptyMessage(1);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	}

	// 自定义相关方法-----异步加载相关数据信息方法
	public void LoadItems() {
		progressDialog = ProgressDialog.show(RollActivity.this, "温馨提示",
				"正在加载相关数据信息...", true);
		Thread t = new Thread(RollActivity.this);
		t.start();
	}

}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android ListView 滚动加载item 的相关文章

  • 2023自动化测试需知的4项测试工具!

    一般来说学自动化会建议大家先学selenium 因为最早的时候 自动化就代表selenium 进入测试行业就开始做接口测试 而且现在基本每个公司都需要接口测试 今天就和大家聊一下接口测试的工具 一 Robot Framework 机器人框架
  • Ubuntu添加和设置默认中文字体

    参考 https blog csdn net gengyuchao article details 101215243 首先 通过命令 fc list lang zh 可以查看已安装的中文字体 默认为Ubuntu系统自带的中文字体 安装新字
  • x的n次幂

    题目描述 实现 pow x n 即计算 x 的 n 次幂函数 样例 输入 2 00000 10 输出 1024 00000 说明 100 0 lt x lt 100 0 n 是 32 位有符号整数 其数值范围是 2147483648 214
  • NexT 主题自定义侧边栏图标

    NexT 主题的图标基本上都是由 Font Awesome 提供 但是知乎 CSDN bilibili等大多数国内应用软件的图标在Font Awesome都不支持 为了支持侧边栏各种应用小图标的显示 可以利用嵌入svg格式的图标进行实现 本
  • keil5编译器出现Undefined symbol time (referred from xxx.o).

    我前不久再弄基于stm32控制智能小车电机时 经常出现 error Undefined symbol time referred from xxx o 很烦人 后来我发现了解决办法 在这里我要分享给大家 方法 直接在xxx c文件中给tim

随机推荐

  • Nim游戏详解

    文章目录 废话 正题 证明 举个栗子 拓展题 废话 这是一个过于经典且过于常见的博弈论模型 入门博弈论的话 首先肯定是要知道这个的 正题 N i m Nim Nim 游戏的规则 有 n
  • 数据结构和算法(4)-----栈

    一 栈的一个实际需求 例如 请输入一个表达式计算式 7 2 2 5 1 5 3 3 点击计算 如下图 请问 计算机底层是如何运算得到结果的 注意不是简单的把算式列出运算 因为我们看这个算式 7 2 2 5 但是计算机怎么理解这个算式的 对计
  • 2023“钉耙编程”中国大学生算法设计超级联赛(3)

    Chaos Begin 贪心 凸包 Out of Control DP 递推 Operation Hope 贪心 2 sat与二分 8 bit Zoom 二维前缀 Noblesse Code 轨迹哈希 字典序 差分 Problem 7303
  • 训练集、验证集以及测试集的区别

    1 数据集的划分 训练集 含有参考答案的数据 用来训练模型的已标注数据 用来建立模型 发现规律 验证集 模型训练过程中单独留出的样本集 用于调整模型的超参数和用于对模型的能力进行初步评估 测试集 用来评估模最终模型的泛化能力 但不能作为调参
  • 【cdk的使用】 C语言 零拷贝 链表 队列 栈的使用

    Github地址 https github com wujin1989 cdk cdk的 list 是基于双向循环链表实现 queue 和 stack 基于 list实现 所以cdk用一个双向循环链表实现了三种数据结构 如何使用cdk的链表
  • Python ·保险理赔分析:数据分析

    介绍 提示 这里可以添加系列文章的所有文章的目录 目录需要自己手动添加 在本笔记本中 我们将仔细研究保险索赔 并弄清一些有关血压 BMI 糖尿病 吸烟 年龄和性别等条件如何影响索赔价值的事实 我们将使用散点图 饼图 直方图等通过探索性数据分
  • dnn回归预测_Keras之DNN:基于Keras(sigmoid+linear+mse+predict)利用DNN实现回归预测——DIY多分类数据集&预测新数据点...

    Keras之DNN 基于Keras sigmoid linear mse predict 利用DNN实现回归预测 DIY多分类数据集 预测新数据点 目录 输出结果 实现代码 输出结果 实现代码 coding utf 8 Xa Xb for
  • postman 下载图片_postman测试上传图片接口步骤教程

    Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件 前端也要学会使用 只有这样 当接口调试不通的时候 用测试工具 才能够更有底气的甩一张截图给你家的后端 瞧 这是你写的bug 现在来说一下 怎么测试一个上传图片的
  • 工作日志【 SQL内部规范-ETL银行项目 】

    工作日志 SQL内部规范 ETL银行项目 一 表结构设计 建表时 首先要确定表的业务唯一键 即该表的唯一索引由哪些字段构成 不建议创建没有唯一索引的表 如果要修改表的唯一索引 一定要严格评审 前台 表结构变更 F层的表需要通知JAVA开发
  • SpringCloud项目下使用分布式事务seata TCC模式与AT模式例子

    SpringCloud项目下使用分布式事务seata TCC模式与AT模式例子
  • 3-2 特征二值化

    特征二值化 请参考 数据准备和特征工程 中的相关章节 调试如下代码 基础知识 import pandas as pd pm25 pd read csv home aistudio data data20505 pm2 csv pm25 he
  • 使用Flex&Bison创建新的编程语言

    编译器基本流程 对源文件进行扫描 将源文件的字符流拆分分一个个的词 记号 此为词法分析 根据语法规则将这些记号构造出语法树 此为语法分析 对语法树的各个节点之间的关系进行检查 检查语义规则是否被违背 同时对语法树进行必要的优化 此为语义分析
  • 苹果个人公司类型开发者账号申请(99美元)详解

    最近有用 记录一下 谈到苹果开发者账号 我们需要区分一下个人账号 公司账号和企业账号这三种 还有一种是教育账号 这个就不多说了 个人账号 个人申请用于开发苹果app所使用的账号 仅限于个人使用 申请比较容易 99 公司账号 以公司的名义申请
  • jqgrid 自定义搜索的实现 , 后台实现

    好久没写过博客了 新入职公司比较忙 咳咳 其实是比较懒 最近公司要求做一个后台 于是直接巴拉了bootstrap 的ace折叠菜单改造了下 由于大部分都是数据交互 频繁使用了 ace中包含的 jqgrid 要做后台的朋友可以去搜索一下ace
  • C#中@的用法总结(转)

    本文实例汇总了C 中 的用法 对C 程序设计来说有不错的借鉴价值 具体如下 一 字符串中的用法 1 学过C 的人都知道C 中字符串常量可以以 开头声名 这样的优点是转义序列 不 被处理 按 原样 输出 即我们不需要对转义字符加上 反斜扛 就
  • libxlsxwriter初体验

    C 如何写Excel 大家时间都这么宝贵 没有起因的问题是不值得被优先研究的 这篇博客的起因就是希望找到一个比较合适于C 的开源库 用以在C 中生成Excel文档 其实C 可用的开源Excel库 很多博主都已经撰文提及 例如 c 操作exc
  • 第六篇 TCP协议

    1 专业名词缩写 应用层头 ah Application Header 表示层头 ph Presentation Header 会话层头 sh Session Header 传输层头 th Transport Header 网络层头 nh
  • cJson数组的生成与解析

    cJson数组的生成与解析 cJosn官方源码地址 https sourceforge net projects cjson 使用json偶尔会遇到数组 每次都要去查相关函数 去解析或者生成 在此做一次记录 方便以后使用 按照我自己的使用习
  • 基于opencv视觉图像处理的巡线小车设计(stm32+树莓派+usb摄像头)

    功能说明 1 视觉巡线 usb摄像头 opencv 2 遇到红灯停车 红灯出现在小车右前方时 3 固定动作避障 光电对管 4 按键启动 急停 4 按键调整运行速度 资料说明 本小车图像处理部分在树莓派中实现 小车控制部分在stm32中实现
  • android ListView 滚动加载item

    悉Android的朋友们都知道 不管是微博客户端还是新闻客户端 都离不开列表组件 可以说列表组件是Android数据展现方面最重要的组件 我们今天就要讲一讲列表组件ListView加载数据的相关内容 通常来说 一个应用在展现大量数据时 不会