1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > listview控件Android Android中ListView控件的简单使用

listview控件Android Android中ListView控件的简单使用

时间:2023-07-19 17:20:22

相关推荐

listview控件Android Android中ListView控件的简单使用

文章引自郭霖《第一行代码》

ListView允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据则会滚动出屏幕

使用LIstView控件

1 在布局文件中引入ListView控件

android:layout_width="match_parent"

android:layout_height="match_parent" >

android:id="@+id/list_view"

android:layout_width="match_parent"

android:layout_height="match_parent" >

2 创建ListView子项布局(可以使用Android提供的布局方式)

android:layout_width="match_parent"

android:layout_height="match_parent" >

android:id="@+id/fruit_image"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />

android:id="@+id/fruit_name"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center"

android:layout_marginLeft="10dip" />

3 定义实体类,做为ListView适配器的适配类型

public class Fruit {

private String name;

private int imageId;

public Fruit(String name, int imageId) {

this.name = name;

this.imageId = imageId;

}

public String getName() {

return name;

}

public int getImageId() {

return imageId;

}

}

4 创建一个自定义的适配器(可以使用Android提供的适配器)

public class FruitAdapter extends ArrayAdapter {

private int resourceId;

/**

*context:当前活动上下文

*textViewResourceId:ListView子项布局的ID

*objects:要适配的数据

*/

public FruitAdapter(Context context, int textViewResourceId,

List objects) {

super(context, textViewResourceId, objects);

//拿取到子项布局ID

resourceId = textViewResourceId;

}

/**

* LIstView中每一个子项被滚动到屏幕的时候调用

* position:滚到屏幕中的子项位置,可以通过这个位置拿到子项实例

* convertView:之前加载好的布局进行缓存

*/

@Override

public View getView(int position, View convertView, ViewGroup parent) {

Fruit fruit = getItem(position); //获取当前项的Fruit实例

//为子项动态加载布局

View view = LayoutInflater.from(getContext()).inflate(resourceId, null);

ImageView fruitName = (ImageView) view.findViewById(R.id.fruid_image);

TextView fruitName = (TextView) view.findViewById(R.id.fruit_name);

fruitImage.setImageResource(fruit.getImageId());

fruitName.setText(fruit.getName());

return view;

}

}

5 创建适配器对象(依次传入当前上下文,ListView子项布局ID,适配的数据)

FruitAdapter adapter = new FruitAdapter(MainActivity.this, R.layout.fruit_item, fruitList);

6 调用LIstView的setAdapter()方法,将构建好的适配器对象传递进去,这样LIstView和数据之间的关联就建立完成了

listView.setAdapter(adapter);

至此,LIstView控件就可以使用

LIstView的性能优化

对适配器的代码进行修改:

对已缓存的布局直接使用缓存,对为缓存的布局重新加载

使用内部类对象存储子项布局中子控件对象

public class FruitAdapter extends ArrayAdapter {

private int resourceId;

public FruitAdapter(Context context, int textViewResourceId,

List objects) {

super(context, textViewResourceId, objects);

resourceId = textViewResourceId;

}

/* 由系统调用,获取一个View对象,作为ListView的条目,屏幕上能显示多少个条目,getView方法就会被调用多少次

* position:代表该条目在整个ListView中所处的位置,从0开始

*/

@Override

public View getView(int position, View convertView, ViewGroup parent) {

//重写适配器的getItem()方法

Fruit fruit = getItem(position);

View view;

ViewHolder viewHolder;

if (convertView == null) { //若没有缓存布局,则加载

//首先获取布局填充器,然后使用布局填充器填充布局文件

view = LayoutInflater.from(getContext()).inflate(resourceId, null);

viewHolder = new ViewHolder();

//存储子项布局中子控件对象

viewHolder.fruitImage = (ImageView) view.findViewById(R.id.fruit_image);

viewHolder.fruitName = (TextView) view.findViewById(R.id.fruit_name);

// 将内部类对象存储到View对象中

view.setTag(viewHolder);

} else { //若有缓存布局,则直接用缓存(利用的是缓存的布局,利用的不是缓存布局中的数据)

view = convertView;

viewHolder = (ViewHolder) view.getTag();

}

viewHolder.fruitImage.setImageResource(fruit.getImageId());

viewHolder.fruitName.setText(fruit.getName());

return view;

}

//内部类,用于存储ListView子项布局中的控件对象

class ViewHolder {

ImageView fruitImage;

TextView fruitName;

}

}

ListView的点击事件

listView.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView> parent, View view,

int position, long id) {

Fruit fruit = fruitList.get(position);

// 加入逻辑代码

}

});

ListView适配器

ListView对象使用setAdapter(ListAdapter la)方法给ListView控件设置适配器

适配器继承BaseAdapter,必须重写其getCount()和getView()方法,灵活性高

适配器继承ArrayAdapter,此种适配器局限在于只能是一种类型,构造方法:ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects)

context:上下文对象

resource:ListView条目的布局文件ID

textViewResourceId:T 类型数据绑定在布局文件中的ID

objects:T 类型数据

适配器继承SimpleAdapter,构造方法:SimpleAdapter(Context context, List extends Map> data, int resource, String[] from, int[] to)

context:上下文对象

data:存储Map集合的List对象,作为数据

resource:ListView条目的布局文件ID

from:存储在Map集合中的键,也就代表了要填充到子项布局中的数据

to:要将存储在Map集合中的数据填充到子项布局中的控件ID

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。