当前位置:首页 > 嵌入式 > 嵌入式软件
[导读] 熟悉Android的朋友们都知道,不管是微博客户端还是新闻客户端,都离不开列表组件,可以说列表组件是Android数据展现方面最重要的组 件,我们今天就要讲一讲列表组件ListV

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

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

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

左图中包含了三个布局文件、一个Adapter和一个Activity,右图是我们运行后的主界面。

其中,main.xml是主界面的布局文件,它包含一个ListView组件,代码如下:

01

02

03 android:orientation="vertical"

04 android:layout_width="fill_parent"

05 android:layout_height="fill_parent"

06 android:paddingLeft="3dp"

07 android:paddingRight="3dp">

08

09 android:id="@id/android:list"

10 android:layout_width="fill_parent"

11 android:layout_height="wrap_content"/>

12

这里我们引用了Android内置的名为list的id,因为我们后面要使用到ListActivity,我们的MainActivity继承于它。

然后就是list_item.xml,它是ListView中单个列表项的布局文件,从效果图中可以看到,这里只使用到了一个TextView组件,list_item.xml代码如下:

01

02

03 android:orientation="vertical"

04 android:layout_width="fill_parent"

05 android:layout_height="fill_parent">

06

07 android:id="@+id/list_item_text"

08 android:layout_width="fill_parent"

09 android:layout_height="fill_parent"

10 android:gravity="center"

11 android:textSize="20sp"

12 android:paddingTop="10dp"

13 android:paddingBottom="10dp"/>

14

我们注意到在右图中列表底部有一个按钮不同于其他的列表项,这是什么情况?事实上这个按钮是我们在ListView底部添加的一个视图。ListView 组件提供了两个很实用的功能,那就是可以在顶部和底部添加自定义的视图。我们在此处ListView的底部添加了一个视图用来加载更多数据,这个视图对应 着load_more.xml布局文件,代码如下:

01

02

03 xmlns:android="http://schemas.android.com/apk/res/android"

04 android:orientation="vertical"

05 android:layout_width="fill_parent"

06 android:layout_height="wrap_content">

07

08 android:id="@+id/loadMoreButton"

09 android:layout_width="fill_parent"

10 android:layout_height="wrap_content"

11 android:text="load more"

12 android:onClick="loadMore"/>

13

接下来我们来了解一下我们的Adapter,ListViewAdapter代码如下:

01package com.scott.loadmore;

02

03import java.util.List;

04

05import android.content.Context;

06import android.view.LayoutInflater;

07import android.view.View;

08import android.view.ViewGroup;

09import android.widget.BaseAdapter;

10import android.widget.TextView;

11

12public class ListViewAdapter extends BaseAdapter {

13 private List items;

14 private LayoutInflater inflater;

15

16 public ListViewAdapter(Context context, List items) {

17 this.items = items;

18 inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

19 }

20

21 @Override

22 public int getCount() {

23 return items.size();

24 }

25

26 @Override

27 public Object getItem(int position) {

28 return items.get(position);

29 }

30

31 @Override

32 public long getItemId(int position) {

33 return position;

34 }

35

36 @Override

37 public View getView(int position, View view, ViewGroup parent) {

38 if (view == null) {

39 view = inflater.inflate(R.layout.list_item, null);[!--empirenews.page--]

40 }

41 TextView text = (TextView) view.findViewById(R.id.list_item_text);

42 text.setText(items.get(position));

43 return view;

44 }

45

46 /**

47 * 添加列表项

48 * @param item

49 */

50 public void addItem(String item) {

51 items.add(item);

52 }

53}

这个ListViewAdapter是我们自定义适配器,它继承自BaseAdapter,实例化此适配器需要一个Context对象来获取 LayoutInflater实例和一个集合对象来充当适配器的数据集;在getView方法中我们填充list_item.xml布局文件,完成列表每 一项的数据显示;addItem方法用来在加载数据时向数据集中添加新数据。

最后我们来看一下MainActivity:

001package com.scott.loadmore;

002

003import java.util.ArrayList;

004

005import android.app.ListActivity;

006import android.os.Bundle;

007import android.os.Handler;

008import android.util.Log;

009import android.view.View;

010import android.widget.AbsListView;

011import android.widget.AbsListView.OnScrollListener;

012import android.widget.Button;

013import android.widget.ListView;

014

015public class MainActivity extends ListActivity implements OnScrollListener {

016 private ListView listView;

017 private int visibleLastIndex = 0; //最后的可视项索引

018 private int visibleItemCount; // 当前窗口可见项总数

019 private ListViewAdapter adapter;

020 private View loadMoreView;

021 private Button loadMoreButton;

022 private Handler handler = new Handler();

023

024 @Override

025 public void onCreate(Bundle savedInstanceState) {

026 super.onCreate(savedInstanceState);

027 setContentView(R.layout.main);

028

029 loadMoreView = getLayoutInflater().inflate(R.layout.load_more, null);

030 loadMoreButton = (Button) loadMoreView.findViewById(R.id.loadMoreButton);

031

032 listView = getListView(); //获取id是list的ListView

033

034 listView.addFooterView(loadMoreView); //设置列表底部视图

035

036 initAdapter();

037

038 setListAdapter(adapter); //自动为id是list的ListView设置适配器

039

040 listView.setOnScrollListener(this); //添加滑动监听

041 }

042

043 /**

044 * 初始化适配器

045 */

046 private void initAdapter() {

047 ArrayList items = new ArrayList();

048 for (int i = 0; i < 10; i++) {

049 items.add(String.valueOf(i + 1));

050 }

051 adapter = new ListViewAdapter(this, items);

052 }

053

054 /**

055 * 滑动时被调用

056 */

057 @Override

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

059 this.visibleItemCount = visibleItemCount;

060 visibleLastIndex = firstVisibleItem + visibleItemCount - 1;

061 }

062

063 /**

064 * 滑动状态改变时被调用

065 */

066 @Override

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

068 int itemsLastIndex = adapter.getCount() - 1; //数据集最后一项的索引

069 int lastIndex = itemsLastIndex + 1; //加上底部的loadMoreView项

070 if (scrollState == OnScrollListener.SCROLL_STATE_IDLE && visibleLastIndex == lastIndex) {

071 //如果是自动加载,可以在这里放置异步加载数据的代码

072 Log.i("LOADMORE", "loading...");

073 }

074 }

075

076 /**

077 * 点击按钮事件

078 * @param view

079 */

080 public void loadMore(View view) {

081 loadMoreButton.setText("loading..."); //设置按钮文字loading

082 handler.postDelayed(new Runnable() {

083 @Override

084 public void run() {

085

086 loadData();

087

088 adapter.notifyDataSetChanged(); //数据集变化后,通知adapter

089 listView.setSelection(visibleLastIndex - visibleItemCount + 1); //设置选中项

090

091 loadMoreButton.setText("load more"); //恢复按钮文字

092 }

093 }, 2000);

094 }

095

096 /**

097 * 模拟加载数据

098 */

099 private void loadData() {

100 int count = adapter.getCount();

101 for (int i = count; i < count + 10; i++) {

102 adapter.addItem(String.valueOf(i + 1));

103 }

104 }

105}

如代码所示,我们在onCreate方法被调用时获取listView组件,设置其底部视图为loadMoreView,它包含一个按钮,点击时会触发 loadMore方法调用,另外在为listView设置完适配器时,又为其设置了滑动事件监听器,滑动列表时onScroll会被调用,滑动状态改变时 onScrollStateChanged会被调用。

我们来演示一下这个加载过程:

[!--empirenews.page--]

如图,当点击完按钮后,出现加载动作,加载完之后如右图所示,新数据紧接在原数据之后。然后我们滑动到底部,加载按钮仍可工作:

最后,我们测试一下滑动列表到底部,然后松开,控制台打印如下:

我们看到onScrollStateChanged方法里的if语句里代码执行了,所以如果我们希望自动加载的话,可以把加载代码放于此处。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

罗德与施瓦茨与SmartViser携手开发了一种用于测试符合欧盟销售的智能手机和平板电脑的新Energy Efficiency Index(EEI)标签法规的解决方案。该解决方案的核心是R&S CMX500,这是...

关键字: 智能手机 Android iOS

(全球TMT2023年8月24日讯)2023年8月23日,时值实时3D引擎Unity在华设立合资公司Unity中国一周年之际,Unity中国正式推出Unity中国版引擎——团结引擎。Unity全球CEO John Ri...

关键字: UNITY CE Android 开发者

报告显示:全球电商 App 获客花费接近50亿美元 北京2023年8月23日 /美通社/ -- 全球营销衡量与体验管理平台 AppsFlyer 近日发布《2023 电商 App 营销现状报告》。尽管面临全球经...

关键字: APPS BSP iOS Android

数字机顶盒是一种数字技术下的多媒体娱乐中心,可以实现电视节目接收、播放、存储、网络应用等多种功能。随着科技的发展,数字机顶盒的设计方案也在不断进步和优化。本文将介绍数字机顶盒设计的几种实现方案。

关键字: 数字机顶盒 Android Linux

21ic 近日获悉,原小米 9 号创始员工李明在社交媒体平台公布了旗下首款产品乐天派桌面机器人,为全球首款 Android 桌面机器人,面向极客和发烧友的 AI + 机器人。据悉,李明两个月前宣布创业并进军 AI 领域,...

关键字: 小米 Android 桌面机器人 AI

尽管安装增长放缓,全球游戏 App 获客花费仍高达 267 亿美元 经济低迷导致 2023 游戏 App 营销优先考虑收入指标,用户增长次之 北京2023年3月9日 /美通社/ -- 今天,全球营销衡量与体验管理平台...

关键字: APPS iOS Android BSP

量子计算领域的新里程碑,来了! 谷歌科学家证明,通过增加量子比特的数量,就能降低量子计算的错误率。

关键字: 谷歌 Android Windows

「卫星通讯」正在被普及到每一台智能手机当中。普及的动机并非是消费市场的一个刚需,其实更像是将差异化的功能「抹平」成一个标配。时下,支持「卫星通讯」功能的智能手机只有苹果的 iPhone 14 系列与华为的 Mate 50...

关键字: 卫星通讯 Android 智能手机 iPhone

Android是Google开发的操作系统,支持多种指令集架构 (ISA),包括Arm和x86,多数使用Android的设备都采用Arm架构芯片组。新兴RISC-V架构是免费开放指令集架构,任何人都可用它设计芯片,且无需...

关键字: 谷歌 Android RISC-V架构

智能手机并非每年都取得重大进展,这导致越来越多的人将手机保留两年、三年或四年。不过,普通的 Android 手机能否在遇到问题之前使用那么久?

关键字: Android 安卓 谷歌 智能手机
关闭
关闭