当前位置:首页 > 嵌入式 > 嵌入式软件
[导读] 熟悉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语句里代码执行了,所以如果我们希望自动加载的话,可以把加载代码放于此处。

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

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭