由于手机屏幕尺寸的原因以及手指触屏操作的特性,ListView常常用到。在Android学习笔记(十一):Activity-ListView中,每一个list中的entry只有一个数据,且都只涉及一个view,在本次,我们将学习进一步的变化,让list更为生动,这只需对apdater作进一步的描述。
例子一:每个元素有一个图标和一个信息数据
1)设置主界面的XML文件
<LinearLayout ...>
<!-- 我们需要对list的entry进行地功能之,所以id采用"@android:id/list" -->
<ListView android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
2)设置每个元素格式entry.xml格式
<LinearLayout ...>
<!-- 在每一个元素中(每一行list中),有一个image icon,然后是我们的数据信息 -->
<ImageView android:id="@+id/c82_icon"
android:layout_width="44px"
android:paddingLeft="2px"
android:paddingRight="2px"
android:paddingTop ="10px"
android:layout_height="wrap_content"
android:src="@drawable/android_normal" />
<TextView android:id="@+id/c82_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="44sp" />
</LinearLayout>
3)源代码
源代码很简单,可以参考Android学习笔记(十一):Activity-ListView中的第一个例子。不同的是设置adapter的写法,原来的例子采用了android提供UI格式android.R.layout.simple_list_item_1,在这个例子中我们将采用自定义的layout格式来描述list增个中的元素:
public class Chapter8Test2 extends ListActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.chapter_8_test2);
/* 第一个参数是context,最后一个参数是数据信息来源item,第二个参数是描述entry的layout xml文件,第三个参数是数据信息来源对应元素layout中的哪一个widget。*/
setListAdapter ( new ArrayAdapter<String>( this,R.layout.entry,R.id.c82_label,Chapter8.items));
}
public void onListItemClick(ListView parent, View view, int position, long id){
Toast.makeText(getApplicationContext(), Chapter8.items[position], Toast.LENGTH_SHORT).show();
}
例子二:根据layout xml文件,动态设置每个元素
上面的方式可以处理简单的方式,但是下面两种情况
- 不是所有的单元都使用同一个layout
- 需要设置在list单元中的widget,例如使用不同的icon
我们需要创建adapter的子类,通过重写getView()来描述自己的单元风格。在下面的例子中,我们对第一个例子进行修改,对于长短不同的单词,使用不同的icon。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.chapter_8_test2);
setListAdapter(new IconicAdapter());
}
private class IconicAdapter extends ArrayAdapter<String>{
/* 步骤1:编写构造函数,对于第一个例子,我们填入格式layout xml文件和数据来源,以便完成必要的初始化工作 */
IconicAdapter(){
super(Chapter8Test3.this,R.layout.entry,Chapter8.items);
}
/*步骤2:通过重写getView(),具体描述每个元素的格式,输入中position表示list的顺序位置,我们返回的View即使list在position位置的元素的呈现 */
public View getView(int position, View convertView, ViewGroup parent) {
/* 步骤2.1:根据layout xml文件,通过LayoutInflater影射到一个View对象,作为我们list元素UI的基础 */
//LayoutInflater类是用于将layout XML文件实例化为相应的view对象,它从不直接使用,而是使用getLayoutInflater()或者getSystemService(String)来获得已挂在当前context标准的LayoutInflater实例。例如:LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LayoutInflater infalter = getLayoutInflater();
//从第一个参数获得相关的XML的结构,第二个参数是ViewGroup root,最后一个参数表示如果有错误,是否扔出InflateException。
View row=infalter.inflate(R.layout.entry, parent, false);
/* 步骤2.2:具体设置每个View中各个widget的格式和信息 ,在这个例子中,如果信息长度大于4显示一种图标,小于等于显示另一种图标*/
TextView label=(TextView)row.findViewById(R.id.c82_label);
ImageView icon = (ImageView)row.findViewById(R.id.c82_icon);
label.setText(Chapter8.items[position]);
if(Chapter8.items[position].length() > 4){
icon.setImageResource(R.drawable.android_focused);
}else{
icon.setImageResource(R.drawable.android_normal);
}
/*步骤2.3,返回对应position位置的view */
return row;
}
}
例子三:让程序更有效率
例子二可以灵活设置每一个list元素的UI,但是在效率方面,每次滑动,都需要根据getView()来获取view,这对于快速移动时,会出现呆滞缓慢的现象,同时每次CPU的计算也消耗手机电池。在getView()中,有一个参数为View convertView,当我们第一次给出这个元素的UI的View时,convertView为零,此后convertView为我们之前所创建的view对象(重复利用,也避免java在garbage收集时消耗CPU[消耗电源])。可以重复利用我们之前创建的View,如果需要对内容进行改变,可以通过findViewById获得对应的widget对象,对内容进行设置,这样UI只刷新设置的部分。下面是例子三对例子二中getView的修改。
/*为了是程序更有效率,利用之前已经创建的View(即第二个参数),只有第一次显示该元素时,方创建新的View*/
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
//在这个例子中,由于widget的内容不变, 可以在第一次设置中赋值。在本例子中我们按动态显示(需要处理其中的变化),将内容每次都重新设置
if(row == null){
LayoutInflater inflater = getLayoutInflater();
row = inflater.inflate(R.layout.chapter_8_test2_entry,parent,false);
}
TextView label=(TextView)row.findViewById(R.id.c82_label);
label.setText(Chapter8.items[position]);
ImageView icon = (ImageView)row.findViewById(R.id.c82_icon);
label.setText(Chapter8.items[position]);
if(Chapter8.items[position].length() > 4){
icon.setImageResource(R.drawable.android_focused);
}else{
icon.setImageResource(R.drawable.android_normal);
}
return row;
}
例子四:让程序进一步有效率 setTag( )
在上面的例子,我们重复利用了已创建的View,但是findViewById需要在View的层次中寻找,如果View的结构复杂,同样也是消耗CPU的。此外对于每个List元素,在实际的程序中,list元素可能还会存储某些数据。在这个例子,我们引入setTag()和getTag()两个方法。每个View都可以通过setTag()绑带一个object,可以通过getTag()将这个object取出来,这样可以避免findViewById对widget的层层查询,做到快速定位。
//步骤一:设置一个class用来存储list元素的信息
class ViewWrapper{
View base;
TextView label = null;
ImageView icon = null;
ViewWrapper(View base){
this.base = base;
}
TextView getLabel(){
if(label == null)
label = (TextView)base.findViewById(R.id.c82_label);
return label;
}
ImageView getIcon(){
if(icon == null)
icon = (ImageView)base.findViewById(R.id.c82_icon);
return icon;
}
}
... ...余下内容同例子2和例子3,我们重写IconicAdapter的getView()
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ViewWrapper wrapper = null;
//步骤2:如果没有创建View,创建之,并通过setTag()捆绑ViewWrapper对象,如果已经创建,通过getTag()获取ViewWrapper对象。
if(row == null){
LayoutInflater inflater = getLayoutInflater();
row = inflater.inflate(R.layout.chapter_8_test2_entry,parent,false);
wrapper = new ViewWrapper(row);
row.setTag(wrapper);
}else{
wrapper = (ViewWrapper) row.getTag();
}
wrapper.getLabel().setText(Chapter8.items[position]);
if(Chapter8.items[position].length() > 4){
wrapper.getIcon().setImageResource(R.drawable.android_focused);
}else{
wrapper.getIcon().setImageResource(R.drawable.android_normal);
}
return row;
}
}
相关推荐
1、ListView item中加入checkbox后onListItemClick 事件无法触发。 原因:checkbox的优先级高于ListItem于是屏蔽了ListItem的单击事件。 解决方案:设置checkbox的android:focusable="false" 2、选择其中的...
C# ListView添加行距 源代码 ListView添加行距 一、问题 listview控件,可以实现增大行距吗?行与行太紧了,不好看呀。 有办法可以实现吗? 我不想通过加大字体的方法,因为字体大了,行距还是近呀。 我要的是增大行...
知识点:1、解决listView滚动时checkBox的选择状态会发生变化(絮乱);2、ListView的Item长按,点击时间并存,实现同一UI控件多需求响应各类事件;3、点击ListViewItem选中响应Item里的CheckBox;4、计算选中的项数...
C#中,使用Thread新创建一个线程来查询数据库中的信息显示在控件“listView1”上,需要使用Invoke(代理名)方法来访问控件“listView1”,实例讲解 dailiEvent = new daili(SelecDB); if (listView1....
笔者在开发产品过程中,ListView算是用的最多的控件之一了。ListView控件有两大要素比较重要,一是model数据,二是delegate实例。用得好这两个基本上对这一控件没什么问题了,一开始笔者也是这样想的,可是学习不同...
C# ListView使用例子ListView排列方式演示
ListView嵌套ListView,checkbox全选,多选,父item全选后,下面的子item全部选中
实现了ListView添加图片、按钮并添加了ListView跟Button 的双监听,Button实现的是Activity的跳转
解决了listview刷新后重绘的闪烁,用此方法后,不再闪烁。
ListView嵌套ListView并且实现动态设置子ListView的高度,
公司有个项目要用到类似手机QQ聊天记录列表ListView左右滑动后改变item的效果,网上没找到好的代码,偶然在安卓巴士的开源站http://d.apkbus.com/里面找到了SwipeToDismiss的源码...改成自己的显示另一个view的效果就行...
fmx-listview应用fmx-listview应用
viewpage嵌套listview,效果:滑动listview删除,滑动非listview区域viewpage翻页
ListView 自动调整列宽ListView 自动调整列宽
仿新浪微博的ListView下拉更新功能
vb ListView控件 可编辑列的数据。
ListView项之间的距离, ListView项间距, ListView图片间距,ListView图片
listView嵌套listViewDemo,解决了listView嵌套listView后,子ListView不能显示全部内容的问题,通过自定义Listview解决
VB 改变ListView网格颜色 演示代码 帮你改善ListView显示效果
ListView开发实例 ListView示例 ListView案例 小例子 源码