如何使用ListView

发布时间:2025-02-15 16:47:50 来源:君肯网

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&ltString&gtlist

Context context

list表示要显示的数据,context变量在生成View对象时需要用到

构造方法:构造方法是为了给两个成员变量赋值

1

2

3

4

public MyListViewAdapter(List&ltString&gtlist , 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)

如何使用ListView

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只要找一次控件就好了,不用每次都去寻找。 代码表示如下:

&ltspan &gtpackage 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&ltCoupon&gtlist = new ArrayList&ltCoupon&gt()

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&ltCoupon&gtlist) {

this.list.addAll(list)

notifyDataSetChanged()

}

// 清空

public void clear() {

list.clear(https://tijian.scykxy.cn#)

notifyDataSetChanged()

}

}

&lt/span&gt

第四点:

分页加载数据,这样获取的数据会比较少,对网络依赖较少,可以很快完成,加载速度很快

第五点:

对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全部的内容,如果了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

更多相关资讯

ListView控件的最基本用法是在窗体中以表格形式显示数据,是应用非常广泛的一个窗体控件。控件工具箱在初始状态下是没有ListView控 …
查看详情
ListView控件的最基本用法是在窗体中以表格形式显示数据,是应用非常广泛的一个窗体控件。控件工具箱在初始状态下是没有ListView控 …
查看详情
ListView控件的最基本用法是在窗体中以表格形式显示数据,是应用非常广泛的一个窗体控件。控件工具箱在初始状态下是没有ListView控 …
查看详情
相关文章
推荐游戏
风之谷
风之谷
游戏资讯 10.5M
下载
斗罗大陆3
斗罗大陆3
游戏资讯 566.9M
下载
冠军网球
冠军网球
游戏资讯 148.1M
下载
最佳炮手
最佳炮手
游戏资讯 68.1M
下载
如梦下弦月
如梦下弦月
游戏资讯 840.1M
下载
富甲封神传
富甲封神传
游戏资讯 263.0M
下载