- 浏览: 1510674 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
duxingzheZet:
listview.getScrollY(); // 为啥总是0 ...
Android 记录和恢复ListView滚动的位置的两种方法 -
Escalade:
AlertDialog显示错误 Unable to add window token null is not for an application -
陌路千里:
return false即可
form表单只提交值,而不进行页面跳转 -
yubenjie:
不错,说的很全。学习了
maven用途、核心概念、用法、常用参数和命令、扩展 -
fxiaozj:
中文加数字还是不行呀
解决TextView在中文和标点存在情况下一行没显示满就换行问题
本文主要介绍ListView的使用、使用简单数据源、详解如何自定义Adapter(数据源)、如何动态追加内容、如何调整样式以及其他的小技巧
0、添加layout文件view_status.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ADD8E6"> <ListView android:id="@+id/statusListView" android:layout_width="fill_parent" android:layout_height="wrap_content"></ListView> </LinearLayout>
1、使用简单数据源
android提供了ArrayAdapter和SimpleAdapter,满足了简单的list数据源问题
如list显示一系列字符串,只需要
String data[] = {"信息展示1", "信息展示2", "信息展示3"}; ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>( AccountManageActivity.this, R.id.accountLongClickTextView, data); statusListView.setAdapter(arrayAdapter);
其中 ArrayAdapter参数为context、textView的resource id,字符串数组
以下到5为自定义数据源
2、Activity中创建listView,并设置数据源
private Context context; private ListView statusListView = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.view_status_activity); context = getApplicationContext(); statusListView = (ListView)findViewById(R.id.statusListView); StatusAdapter statusAdapter = new StatusAdapter(context, statusInfoList); statusListView.setAdapter(statusAdapter); }
其中StatusAdapter为自定义的数据源,setAdapter设置数据源
3、设置列表每个条目的layout,文件为
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:id="@+id/userIconImageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon_sina" android:layout_margin="8px"> </ImageView> <TextView android:id="@+id/userNameTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="15px" android:textColor="#424952" android:layout_alignParentLeft="true"> </TextView> </LinearLayout>
表示列表每个条目显示一个image和一个text
4、自定义数据源--StatusAdapter数据源定义
public class StatusAdapter extends BaseAdapter { private List<StatusInfo> mStatusList; private Context mContext; public StatusAdapter(Context context, List<StatusInfo> statusList){ mContext = context; mStatusList = statusList; } @Override public int getCount() { // TODO Auto-generated method stub return mStatusList.size(); } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return mStatusList.get(arg0); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { convertView = LayoutInflater.from(mContext).inflate(R.layout.status_activity, null); StatusView statusView = new StatusView(); statusView.setUserIcon((ImageView)convertView.findViewById(R.id.userIconImageView)); statusView.setUserName(((TextView)convertView.findViewById(R.id.userNameTextView))); StatusInfo statusInfo = mStatusList.get(position); if (statusInfo != null && statusView != null) { if (statusView.getUserName() != null) { statusView.getUserName().setText(statusInfo.getUserName()); } …… } return convertView; } }
其中BaseAdapter为
Common base class of common implementation for an Adapter
that can be used in both ListView
(by implementing the specialized ListAdapter
interface} and Spinner
(by implementing the specialized SpinnerAdapter
interface.
四个必须实现的函数
4.1、getCount表示在适配器的数据集中有多少数据
public int getCount()
4.2、getItem表示得到固定位置的数据集
public Object getItem(int arg0)
4.3、getItemId表示得到lilst中固定位置的条目id
public long getItemId(int position)
4.4、getView表示得到list中固定位置的条目内容
public View getView(int position, View convertView, ViewGroup parent)
见
Get a View that displays the data at the specified position in the data set. You can either create a View manually or inflate it from an XML layout file. When the View is inflated, the parent View (GridView, ListView...) will apply default layout parameters unless you use inflate(int, android.view.ViewGroup, boolean) to specify a root view and to prevent attachment to the root.
5、每个条目对应的实体类
public class StatusView { public ImageView userIcon; public TextView userName; public void setUserIcon(ImageView userIcon) { this.userIcon = userIcon; } public TextView getUserName() { return userName; } public void setUserName(TextView userName) { this.userName = userName; } }
在调试的时候出现一个问题,将断点设置在StatusAdapter的getView函数中,始终无法跳进去,list显示为空
后来发现是getCount使用了默认的函数体return 0; 修改为 return mStatusList.size();问题解决
因为listview在开始绘制的时候会调用getCount得到条目的总个数,根据个数注意调用getView绘制每一个条目,这就是为啥return 0;列表不会显示啦
6、listView自动追加内容
从上面5最后的介绍可知,首先需要修改getCount的返回值,然后刷新adapter,即通知adapter数据集变更即可。adapter会自动刷新,先调用getCount得到条目的总个数,然后依次调用getView。
上例中如下即可
statusAdapter.getStatusList().addAll(statusInfoList); statusAdapter.notifyDataSetChanged();
第一条语句表示追加list,因为getCount是读取list大小,所以也会向相应变化,第二条语句表示通知adapter数据集变更。如果想listView达到底部时自动追加内容可以如下:
/** * listView的滚动事件 */ @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { /** * 表示当内容多余一屏并且到达listView底时自动追加 */ if (firstVisibleItem > 0 && totalItemCount > 0 && (firstVisibleItem + visibleItemCount == totalItemCount)) { setListAdapter(); } }
7、listView得到每一个条目的view
经常我们需要在点击或长按item的时候进行相应的响应操作
public void onItemClick(AdapterView<?> arg0, View itemView, int position, long id)
这个时候我们很想得到存储在某个item中的数据,如用户名、用户id、时间等,这个时候如何得到呢
上述函数的第二个参数意义如下
view The view within the AdapterView that was clicked (this will be a view provided by the adapter)
view即表示点击的条目,包含其条目信息,其实这个view就相当于BaseAdapter中getView返回的view。所以我们只要跟getView中set操作相应使用get操作即可得到
参考:
http://developers.androidcn.com/reference/android/widget/AdapterView.OnItemClickListener.html
8、设置了背景颜色后,listview在滚动时背景色变黑
listView默认为透明的背景,当使用一个自定义的背景时,在静止情况下listView显示正常,但在滚动滚动条时,listView又会使用默认的(黑色)背景。由于android framework采用了"cache color hint.",即窗口采用默认的背景色,为RGB色,是为了取代性能较差的Porter - Duff混合模式(一种实现淡入淡出效果的模式)。android dark主题默认色为“#191919”。因为listView默认的背景色是透明的,当listView重绘其子控件时候,会用窗口的背景色代替,在滚动listView时需要不停的重绘listView,为了提高性能,这时候android framework框架又重新使用了cache color hint,listView将其子控件的所有背景色填充为cache color hint。更多参考listView backGround
从上面可知,要解决这个问题,我们只需要把默认的cache color hint去掉即可,以下两种方法皆可
a、layout文件中listView的属性增加cacheColorHint
android:cacheColorHint="@color/activityBgColor"
b、activity中listView创建时候setCacheColorHint
statusListView.setCacheColorHint(0);
注意如下代码并不能达到效果
statusListView.setCacheColorHint(R.color.activityBgColor);
参考:
http://developer.android.com/resources/articles/listview-backgrounds.html
9、listView前或后面添加其他控件,如Button
如果直接在listView所在的layout文件listView前或者后面添加一个Button,在Activity中create后发现无法显示,这个时候我们可以用listView的addHeaderView或addFooterView实现相应效果,在前或后面添加Button,代码如下
statusListView = (ListView)findViewById(R.id.statusListView); Button moreStatusesBt = new Button(this); moreStatusesBt.setText("更多状态"); moreStatusesBt.setBackgroundColor(R.color.activityBgColor); moreStatusesBt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { setListAdapter(); } }); statusListView.addFooterView(moreStatusesBt);
如果是较多的控件,可以另外定义一个layout文件,在程序中加载此文件后,设置header或footer,如下:
View header = ((LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.comment_list_header, null, false); commentListView.addHeaderView(header);
碰到一个奇怪的问题,当TextView为footer时,无法设置其高度,设置时报异常,
java.lang.IllegalArgumentException: bitmap size exceeds 32bits
设置代码如下:
LayoutParams param = new LayoutParams(LayoutParams.FILL_PARENT, R.dimen.moreStatusesBtHeight); loadTipText.setLayoutParams(param);
或如此设置高度
loadTipText.setHeight(R.dimen.moreStatusesBtHeight);
都会出现异常
对于增加了多个控件的listView,在layout中设置的时
<ListView android:id="@+id/commentsListView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:cacheColorHint="@color/activityBgColor"> </ListView>
android:layout_height不能为wrap_content否则,listView显示无法滚动
参考:
http://developers.androidcn.com/reference/android/widget/ListView.html
http://developer.android.com/reference/android/widget/Adapter.html
10、样式
10.1、分割线样式,分别表示颜色和高度
android:divider="#FFCC00" android:dividerHeight="4px"
11、快速定位
statusListView.setSelection(0);
上面表示定位到index为0的item,即第一个item。
如果存在setAdapter或adatper更新,如下
statusAdapter.notifyDataSetChanged();
需要将setSelection放在其后面
12、滚动到某个位置
使用statusListView.scrollTo(x, y)滚动到某个位置,如scrollView.scrollTo(0, 0)表示滚动到顶部
如果刚刚更新adapter,则调用statusListView.setSelection(0)滚动到顶部;
13、记录和恢复ListView滚动的位置
见http://trinea.iteye.com/blog/1481474
发表评论
-
Android 开源库获取途径整理
2014-08-20 02:14 3398最新内容请见原文: http://www.trinea.c ... -
滚动到底部加载更多及下拉刷新listview的使用
2013-06-24 21:11 5632最新内容建议直接访问原文:滚动到底部加载更多及下拉刷新li ... -
Android系统下载管理DownloadManager功能介绍及使用示例
2013-05-23 13:03 10966建议直接访问原文:Android系统下载管理Downloa ... -
Sqlite插入或更新
2013-05-15 09:20 1542在数据库中我们经常会有这种需求,插入时,某条记录不存在则插入, ... -
android.os.BadParcelableException: ClassNotFoundException when unmarshalling
2013-05-08 12:55 2381应用打开,home键到后台,一段时间打开,偶现fc andro ... -
viewpager实现画廊(一屏多个Fragment)效果
2013-04-08 09:15 4383最新内容建议直接访问原文:viewpager实现画廊(一屏 ... -
Android性能调优工具TraceView介绍
2013-04-01 08:56 2080本文主要介绍Android性能调优工具TraceView的使 ... -
Android应用如何开机自启动、自启动失败原因
2013-03-26 09:15 2385Android应用如何实现开机自启动? 开机自启动 ... -
测试Title
2013-03-23 10:47 9测试内容,包百度, -
Android APK反编译查看源码及资源文件
2013-03-20 09:09 2270想学习下其他Apk的源码吗? 想看看其他Apk的图片资源 ... -
Android性能调优
2013-03-11 21:26 1474本文主要分享自己在appstore项目中的性能调优点. ... -
添加android-support-v4 错误 java.lang.ClassNotFoundException: android.support.v4.vie
2012-11-16 19:04 4284在使用ViewPager添加android-support-v ... -
Android 直接查看Sqlite数据库数据
2012-11-16 19:03 1601本文主要介绍Android开发中如何直接查看sqlite数据库 ... -
Android 自定义View并添加属性
2012-11-14 20:09 1185本文主要介绍如何为自定义的View添加属性以及属性的类型。 ... -
Android开发中调用Google Map或Baidu Map
2012-11-14 19:27 1621本文主要介绍如何在Android中引入地图及并对地图进行相应的 ... -
Google Map API运行提示Installation error: INSTALL_FAILED_MISSING_SHARED_LIBRARY
2012-11-14 19:26 1678Google Map API运行提示Installation ... -
Android 开发利用wifi调试
2012-11-14 19:25 1672本文主要介绍在Android开发中如何利用wifi进行应用调试 ... -
Android Service介绍
2012-11-14 18:51 1118本文主要介绍Service的概念及作用、使用(包括长时间运 ... -
Android AIDL应用间交互
2012-11-12 18:52 1195本文主要介绍使用Service进行应用间的交互。 ... -
Android BroadcastReceiver介绍
2012-11-12 18:51 1241本文主要介绍BroadcastReceiver的概念、使用 ...
相关推荐
本篇文章将深入探讨几个关键的Android ListView使用技巧,帮助你提升应用的用户体验和性能。 1. **适配器Adapter的使用** ListView的核心在于适配器,它负责将数据集转化为ListView可显示的视图。常见的适配器有...
总之,"android listview使用方法demo"是一个很好的学习资源,涵盖了ListView的基本使用和常见的扩展功能。通过研究这个Demo,开发者可以深入理解如何在Android应用中有效地使用ListView,展示和处理大量数据。
在Android开发中,ListView是一个非常重要的组件,它用于展示大量数据列表,通常用于实现像通讯录、消息列表等效果。本教程将详细讲解如何在实际项目中使用ListView,并结合源码分析其工作原理。 首先,我们需要...
以下是一个关于如何在Android中使用ListView的简单事例: 第一步:新建`MyListActivity`继承自`ListActivity` 在创建一个基于ListView的活动时,通常会继承`ListActivity`类,因为它为ListView提供了一些便利的方法...
综上所述,要在Android的ListView中使用Checkbox,我们需要创建自定义Adapter,设计Checkbox的布局,管理复选状态,监听并处理用户操作,同时注意性能优化和状态恢复。在实际项目中,这样的实现方式能够提供灵活的...
Android中使用ArrayAdapter的demo,比较简单,里面用两种方法实现,在MainActivity里面,其中一种被我注释起来了,大家把注释去掉就好了。没有使用自定义适配器,对应的我的博客地址是:...
ListView使用simpleAdapter填充实现,数据结构是HashMap,对应的我的博客地址是: http://blog.csdn.net/u012320459/article/details/47667869
这个"Android下使用ListView的简单Demo"旨在帮助开发者理解如何在实际项目中有效地运用ListView。下面将详细介绍ListView的基本使用、适配器原理以及一些常见的优化策略。 1. **ListView的基本结构** ListView的...
在实际开发中,为了优化性能,通常会使用ViewHolder模式来减少视图查找的时间,同时对ListView进行适当的滚动优化,如使用懒加载、设置Item的复用策略等。 最后,记得处理触摸事件,确保点击父ListView的条目时不会...
总的来说,Android ListView的边角圆角美化涉及到自定义布局、形状资源、适配器的使用以及一些细节的优化。通过这种方式,我们可以使ListView更加美观,提升应用的整体设计感。同时,也要注意性能问题,避免过度绘制...
在Android开发中,ListView是一种常用的组件,用于展示可滚动的多行数据列表。而当需要在ListView中实现单选功能时,我们通常会使用RadioButton。本文将深入探讨如何在ListView中集成RadioButton,以及相关的实现...
在Android开发中,ListView是一种非常常见的控件,用于展示大量数据列表。它的高效性和可滚动性使得它在显示数据集合时十分有用。然而,当ListView的子项(item)宽度超过屏幕宽度时,如何实现自动换行就成了一个...
在Android开发中,ListView是常用的一种控件,用于展示大量数据列表。`下拉刷新`和`上拉加载`功能的实现,极大地提升了用户体验,让用户能够实时获取到最新的数据。本篇文章将深入探讨如何在ListView中实现这两种...
在Android开发中,ListView是一种非常常见的控件,用于展示大量数据列表。它的网格布局模式使得数据以多列的形式展示,增强了界面的可读性和用户体验。本文将深入探讨如何在Android中实现一个基于ArrayAdapter的网格...
本篇文章将深入探讨如何在Android应用中有效地使用ListView。 首先,我们来了解ListView的基本结构。ListView由多个列表项(List Item)组成,这些列表项通常通过一个自定义的布局文件定义。布局文件中包含每个列表...
这是重写的继承自ArrayAdapter类的自定义适配器方式,数组元素是自定义类。对应的我的博客地址是:http://blog.csdn.net/u012320459/article/details/47667869
在Android开发中,ListView是一种常用的组件,用于展示大量的数据列表。然而,当列表项过多时,滚动时表头(Header)会随着滚动消失,给用户查看和理解数据带来不便。为了解决这个问题,开发者通常会实现一个固定...
Android listview viewpager 滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决 blog 地址 : http://blog.csdn.net/aaawqqq/article/details/43824631
对于这些问题,可以通过设置ListView的`transcriptMode`属性、监听软键盘的显示隐藏、或者使用诸如`android:descendantFocusability`这样的XML属性来调整ListView的行为。 至于提到的"后2个包没用",可能是指在解决...
这个实例源码“Test_Golf1”很可能包含了一个完整的ListView应用示例,帮助开发者理解如何在Android中有效地使用ListView。下面将详细阐述ListView的相关知识点。 1. **ListView基本使用**: - `ListView`是...