ListView控件的最基本用法是在窗体中以表格形式显示数据,是应用非常广泛的一个窗体控件。控件工具箱在初始状态下是没有ListView控
件的,需要我们在工具-附加控件中勾选\”Microsoft ListView Control,Version
6.0\”,这样ListView控件就会显示在控件工具箱中了。ListView分为表头和数据两部分,而数据部分的第一列和其他列又是分开的,需要用不
同的方式来访问。假设我们在Sheet1中有一个5行4列的表格,现在我们看下怎样将这个表格中的数据导入到ListView控件中。
下面我们先来看怎样给ListView控件添加表头。有两种方法,先来看第一种
Private Sub UserForm_Initialize()
ListView1.ColumnHeaders.Add 1, \”A\”, \”姓名\”, ListView1.Width / 4, lvwColumnLeft \’列数,key,text,宽度,对齐方式,图片
ListView1.ColumnHeaders.Add 2, \”B\”, \”性别\”, ListView1.Width / 4, lvwColumnCenter
ListView1.ColumnHeaders.Add 3, \”C\”, \”年龄\”, ListView1.Width / 4, lvwColumnCenter
ListView1.ColumnHeaders.Add 4, \”D\”, \”住址\”, ListView1.Width / 4, lvwColumnCenter
ListView1.View = lvwReport\’显示方式
ListView1.FullRowSelect = False \’是否整行选取
ListView1.Gridlines = True \’是否显示表格线
End Sub
添加表头的第一种方法是用ColumnHeaders.Add的方法,该方法包括6个参数,比如上面第一行代码中1代表第一列,\”A\”是该列的一个
简称(不写也可以),“姓名”是要显示的文字,下一个参数是宽度,这里我们一共4列,所以第一列宽度设为控件宽度(ListView1.Width)的
1/4,第5个参数是对齐方式,其中第一列必须是左对齐的,其他列可以设置左右或居中对齐,第6个参数是图标索引,我们后面再讲,这里其中所有的参数都是
可省略的,一般写上显示的文字和宽度即可。ListView1.View是设置ListView控件的显示方式,一共四种,这里lvwReport是报表
形式显示,其他的我们后面再讲。FullRowSelect是指可否整行选取,Gridlines是否显示网格线,这些属性自己试下就知道了。
当然我们也可以用循环的方式来简化代码
Private Sub UserForm_Initialize()
Dim i
For i = 1 To 4
ListView1.ColumnHeaders.Add i, , Cells(1, i), ListView1.Width / 4
Next
ListView1.FullRowSelect = True
ListView1.View = lvwReport
ListView1.Gridlines = True
End Sub
对列加了个For循环而已,其实是完全相同的。
下面我们来看怎样向ListView控件中添加数据。两种方法,下面来看第一种
Private Sub CommandButton1_Click()
Dim itm As ListItem, i, List, li
ListView1.ListItems.Clear \’清除数据
For i = 2 To 5
Set itm = ListView1.ListItems.Add \’添加一个空行
itm.Text = Cells(i, 1) \’添加第一列
itm.SubItems(1) = Cells(i, 2) \’添加第二列
itm.SubItems(2) = Cells(i, 3)
itm.SubItems(3) = Cells(i, 4)
Next
End Sub
当然添加新数据之前要把原有数据先删除,用的是ListItems的Clear方法ListItem对象就是控件的行。先用ListItems的
Add方法添加一个空行,用变量itm来表示,下面就要向这个空行中添加数据,我们上面说过第一列和其他列的表示方法是不同的,第一列赋值要用Text,
之后各列用SubItems数组来赋值,第2列序号是1,第3列序号是2,依次类推。
下面来看添加数据的另一种方法,ListSubItems对象
\’ For i = 2 To 5
\’ Set List = ListView1.ListItems.Add(Text:=Cells(i, 1))
\’ Set li = List.ListSubItems.Add(Text:=Cells(i, 2)) \’subitems是个数组,Listsubitems是个对象集合
\’ Set li = List.ListSubItems.Add(Text:=Cells(i, 3))
\’ Set li = List.ListSubItems.Add(Text:=Cells(i, 4))
\’ Next
前面都一样,我只把For循环这段贴出来了,同样是用ListItems.Add新建一个空行,不同的是直接给其赋了一个值,这个值就是赋在第一列
的,之后又用List(刚添加的空行)的ListSubItems的Add方法,相当于在该行添加一个列,再赋值,有几列就添加用个
ListSubItems。ListSubItems和SubItems的区别在于前者是一个对象集合,既然是对象就有可以设置格式(可以和工作表的
Range对象类比),而后者仅仅是一个数组,因此也就不存在格式之类的属性了,所以如果需要给ListView控件改变格式就要用
ListSubItems对象。
如何优化listview
创建继承BaseAdapter并实现其抽象方法的类MyListViewAdapter
说明
下面的讲解中,只创建自定义的适配器类,如何使用请参考android中常用控件的使用之ListView
1.创建类MyListViewAdapter
创建类MyListViewAdapter,该类继承BaseAdapter,并实现其抽象方法:
1
2
3
4
int getCount()
Object getItem(int position)
long getItemId(int position)
View getView(int position,View convertView,ViewGroup parent)
getCount需要返回有多少个item,也就是说最会在listview中展示这么多行
getItem需要返回参数position位置的数据
getItemId返回position就行了
2.给MyListViewAdapter类添加成员变量和构造方法
两个成员变量
1
2
List<String>list
Context context
list表示要显示的数据,context变量在生成View对象时需要用到
构造方法:构造方法是为了给两个成员变量赋值
1
2
3
4
public MyListViewAdapter(List<String>list , Context context) {
this.list = list
this.context = context
}
3.给getCount,getItem,getItemId方法添加代码
getCount需要返回有多少个item,也就是说最会在listview中展示这么多行,所以返回list.size
getItem需要返回参数position位置的数据,也就是list中第position项的值list.get(position)
getItemId返回position就行了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Override
public int getCount() {
return list.size()
}
@Override
public Object getItem(int position) {
return list.get(position)
}
@Override
public long getItemId(int position) {
return position
}
4.给getView方法添加代码
getView方法是返回位置为position的View对象,第二个参数convertView考虑到资源重用问题,在上下滑动的过程中,需要显示某项的时候才会调用getView方法,而如果有某项被隐藏不显示,就会把不显示那一行的View作为convertView参数传入,如果没有某项被隐藏,convertView值为null。可以通过下面代码中的if(convertView!=null)中的输出来看哪一行被隐藏了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Override
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println(\”调用getView方法,显示position=\”+position+\”项\”)
if(convertView!=null){
TextView t = (TextView) convertView.findViewById(R.id.firstTextView)
System.out.println(t.getText())
}else{
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)

convertView = layoutInflater.inflate(R.layout.item_mylistviewadapter, null)
}
TextView t = (TextView)(convertView.findViewById(R.id.firstTextView))
t.setText(list.get(position))
if(position%2==0)
{
t.setBackgroundColor(Color.WHITE)
}
else{
t.setBackgroundColor(Color.GRAY)
}
return convertView
}
补充:通过xml生成View对象
通过Context对象生成一个LayoutInflater对象
调用LayoutInflater对象的inflate方法生成控件对象,inflate方法的第一个参数为xml文件,第二个参数一般为null。返回值为该xml文件最外层的标签对象。
1
2
LayoutInflater layoutInflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)
LinearLayout convertView =(LinearLayout)layoutInflater.inflate(R.layout.item_mylistvie
源代码下载
pan.baidu.com/s/1ntuQDdv
Listview与Recycleview的区别
一:概要
众所周知,在开发过程中,ListView的优化是比较重要的那么,如何去优化呢?
如何ListView的提升效率,好像有很多,其实最主要的就是在于adapter中getView方法的优化,那么如何使的getView优化呢?
第一点:
在getView() 中重用了convertView,很大程度上的减少了内存的消耗。通过判断convertView是否为null,是的话就需
要产生一个视图出来,然后给这个视图数据,最后将这个视图返回给底层,呈献给用户。
第二点:
比如:listview 屏幕显示10条数据,当用户滑动listview的时候,第11条数据出现的时候,第一条数据就会被android本身提供
的 Recycler,将这条item(View)放进RecycleBin(回收站)中,然后显示新视图的时候,从RecycleBin中重复用这个View。就
不会造成每次都要去创建新的View,而节约了大量的资源。
第三点:
自身写一个ViewHolder 类,这个ViewHolder,用来标识view中一些控件,方便进行一些事件相应操作的设置,这样就 不用每次 getView() 的View只要找一次控件就好了,不用每次都去寻找。 代码表示如下:
<span >package com.x1.tools.adapter
import java.util.ArrayList
import java.util.List
import android.annotation.SuppressLint
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.ImageView
import android.widget.TextView
import com.x1.tools.Config
import com.x1.tools.vo.Coupon
import com.x1.ui.R
/***
* 优惠卷的适配器
*
* @author zengtao 2015年3月31日 上午9:46:08
*/
@SuppressLint({ \”InflateParams\”, \”SimpleDateFormat\” })
public class CouponAdapter extends BaseAdapter {
private List<Coupon>list = new ArrayList<Coupon>()
private Context context
private int[] couponImage = { R.drawable.coupon_image_1,
R.drawable.coupon_image_2 }
private int[] couponRight = { R.drawable.coupon_rightimage }
public CouponAdapter(Context context) {
this.context = context
}
@Override
public int getCount() {
return list.size()
}
@Override
public Coupon getItem(int position) {
return list.get(position)
}
@Override
public long getItemId(int position) {
return position
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(
R.layout.coupon_item_list, null)
ViewHolder vh = new ViewHolder(convertView)
convertView.setTag(vh)
}
ViewHolder viewHolder = (ViewHolder) convertView.getTag()
viewHolder.fillView(getItem(position))
return convertView
}
/**
* 内部类实现查找控件和数据的显示,这样可以实现布局和控件只加载一次
*
* @author zengtao 2015年3月31日 下午1:34:00
*/
class ViewHolder {
public ImageView mCouponImage, mCouponRight
public TextView mCouponMoney, mCouponDisplayMessage, mCouponTime
public ViewHolder(View view) {
mCouponImage = (ImageView) view.findViewById(R.id.coupon_icon)
mCouponRight = (ImageView) view.findViewById(R.id.coupon_righticon)
mCouponMoney = (TextView) view.findViewById(R.id.coupon_money)
mCouponDisplayMessage = (TextView) view
.findViewById(R.id.coupon_message)
mCouponTime = (TextView) view
.findViewById(R.id.coupon_stime_endtime)
}
public void fillView(Coupon coupon) {
Coupon cou = coupon
if (cou.getCoupon_bgimage() == 1) {
mCouponImage.setImageResource(couponImage[0])
} else if (cou.getCoupon_bgimage() == 0) {
mCouponImage.setImageResource(couponImage[1])
}
if (cou.getCoupon_iconimage() == 0) {
mCouponRight.setImageResource(couponRight[0])
}
mCouponMoney.setText(cou.getCoupon_money() + \”元\”)
mCouponDisplayMessage.setText(cou.getCoupon_access())
mCouponTime.setText(Config.formatDate(cou.getCoupon_begintime())
+ \”至\” + Config.formatDate(cou.getCoupon_endtime()))
}
}
// 添加数据
public void addAll(List<Coupon>list) {
this.list.addAll(list)
notifyDataSetChanged()
}
// 清空
public void clear() {
list.clear(https://tijian.scykxy.cn#)
notifyDataSetChanged()
}
}
</span>
第四点:
分页加载数据,这样获取的数据会比较少,对网络依赖较少,可以很快完成,加载速度很快
第五点:
对ListView做滚动事件处理,当ListView在滚动的过程中,不去加载网络图片,等滚动结束,在加载图片
用法上的区别
1、listview的用法
1)继承的时BaseAdapter,需要重写四个方法
2)不强制使用viewholder
3)可以直接使用item的点击事件
4)不用单独设置分隔线
5)不可以定向刷新某一条数据
2、recycleview的用法
1)继承的是Recycleview.Adapter
2)必须使用viewholder,封装了view的复用
3)使用布局管理器管理布局的样式(横向、竖向、网格、瀑布流布局)
4)点击事件可以使用给控件设置点击事件,也可以自定义点击事件。
5)可以自定义绘制分隔线
6)可以自定义item删除增加的动画效果
7)可以定向刷新某一条数据notifyItemChanged等众多方法
以上就是关于如何使用ListView全部的内容,如果了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!