介绍
列表视图(ListView)是 Android 中最常用的一种视图组件,它以垂直列表的形式列出需要显示的列表项。
XML属性
XML属性 | 描述 |
android:divider | 用于为列表视图设置分隔条,既可以用颜色分隔,也可以用 Drawable 资源分隔 |
android:dividerHeight | 用于设置分隔条的高度 |
android:entries | 用于通过数组资源为 ListView 指定列表项 |
android:footerDividersEnabled | 用于设置是否在 footer View(底部视图)之前绘制分隔条,默认值为true,设置为 false 时,表示不绘制。使用该属性时,需要通过 ListView 组件提供的 addFooterView() 方法为 ListView 设置 footer View |
android:headerDividersEnabled | 用于设置是否在 header View(头部视图)之后绘制分隔条,默认值为true,设置为 false 时,表示不绘制。使用该属性时,需要通过 ListView 组件提供的 addHeaderView() 方法为 ListView 设置 header View |
android:entries="@array/character"
编写用于指定列表项的数组资源文件,并将其保存在 res/values 目录中,这里将其命名为
“ arrays.xml ”,在该文件中添加一个字符串数组,名称为“ character ”,具体代码如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="character">
<item>阿米娅</item>
<item>赛爹</item>
<item>小火龙</item>
<item>白咕咕</item>
<item>拉狗</item>
<item>阿能</item>
<item>德狗</item>
<item>阿能</item>
<item>kokodayo</item>
</string-array>
</resources>
例子
ListView的简单用法
编写布局文件
新建一个ListViewTest项目,自动创建好项目,修改main_layout.xml中的代码,如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
编写MainActivity
对于纯文字的列表项, 通 常 使 用 ArrayAdapter 对 象。 创建ArrayAdapter 对象通常可以有两种方式:一种是通过数组资源文件创建;另一种是通过在 Java 文件中使用字符串数组创建。这与 Spinner下拉列表框中介绍的创建 ArrayAdapter 对象基本相同,所不同的就是在创建该对象时,指定列表项的外观形式。在 Android API 中默认提供了一些用于设置外观形式的布局文件,通过这些布局文件,可以很方便地指定 ListView 的外观形式。常用的布局文件有以下几个:
- simple_list_item_1:每个列表项都是一个普通的文本
- simple_list_item_2:每个列表项都是一个普通的文本(字体略大)
- simple_list_item_checked:每个列表项都有一个已选中的列表项
- simple_list_item_multiple_choice:每个列表项都是带复选框的文本
- simple_list_item_single_choice:每个列表项都是带单选按钮的文本
public class MainActivity extends AppCompatActivity {
private String[] data = {"Apple", "Banana", "Orange", "Watermelon", "Pear",
"Grape", "Pineapple", "Strawberry", "Cherry", "Mango","plum","durian",
"chestnut","litchi","Chinese date","Greengage","pomegranate"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
MainActivity.this, android.R.layout.simple_list_item_1, data);
ListView listView = (ListView) findViewById(R.id.list_view);
listView.setAdapter(adapter);
}
}
定制ListView的界面
定义实体类Fruit.java
新建一个java文件,定义一个实体类fruit:name表示水果的名字,imageId表示水果对应图片的资源id
package com.example.listviewtest;
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;
}
}
定义fruit_item.xml
在layout目录下自定义一个布局fruit_item.xml:
- 定义一个ImageView用于显示水果的图片
- 又定义一个TextView用于显示水果的名称,并让TextView在垂直方向上居中显示
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/fruit_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/fruit_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp"/>
</LinearLayout>
定义适配器FruitAdapter.java
再创建一个Java文件,用来自定义一个适配器FruitAdapter,继承自ArrayAdapter,并将泛型指定为Fruit类
public class FruitAdapter extends ArrayAdapter<Fruit> {
private int resourceId;
public FruitAdapter(Context context, int Resource, List<Fruit> objects){
super(context,Resource,objects);
resourceId=Resource;
}
@Override
public View getView(int position, View convertView,ViewGroup parent) {
Fruit fruit = getItem(position);
//当为false时表示只让我们在父布局中声明的layout属性生效,但不为这个View添加父布
//局,因为一旦View有了父布局之后,它就不能添加到ListView中了
View view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
TextView fruitName = (TextView) view.findViewById(R.id.fruit_name);
fruitImage.setImageResource(fruit.getImageId());
fruitName.setText(fruit.getName());
return view;
}
}
API LayoutInflater
API Adapter
编写MainActivity
接下来修改MainActivity中的代码,如下:
public class MainActivity extends AppCompatActivity {
private List<Fruit> fruitList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
initFruit();
FruitAdapter adapter = new FruitAdapter(MainActivity.this, R.layout.fruit_item, fruitList);
ListView listView = (ListView) findViewById(R.id.list_view);
listView.setAdapter(adapter);
}
private void initFruit(){
for (int i = 0; i < 2; i++) {
Fruit apple = new Fruit("Apple", R.drawable.apple_pic);
fruitList.add(apple);
Fruit banana = new Fruit("Banana", R.drawable.banana_pic);
fruitList.add(banana);
Fruit orange = new Fruit("Orange", R.drawable.orange_pic);
fruitList.add(orange);
Fruit watermelon = new Fruit("Watermelon", R.drawable.watermelon_pic);
fruitList.add(watermelon);
Fruit pear = new Fruit("Pear", R.drawable.pear_pic);
fruitList.add(pear);
Fruit grape = new Fruit("Grape", R.drawable.grape_pic);
fruitList.add(grape);
Fruit pineapple = new Fruit("Pineapple", R.drawable.pineapple_pic);
fruitList.add(pineapple);
Fruit strawberry = new Fruit("Strawberry", R.drawable.strawberry_pic);
fruitList.add(strawberry);
Fruit cherry = new Fruit("Cherry", R.drawable.cherry_pic);
fruitList.add(cherry);
Fruit mango = new Fruit("Mango", R.drawable.mango_pic);
fruitList.add(mango);
}
}
}
提升ListView的运行效率
修改FruitAdapter中的代码:
public class FruitAdapter extends ArrayAdapter<Fruit> {
private int resourceId;
public FruitAdapter(Context context, int textViewResourceId, List<Fruit> objects){
super(context,textViewResourceId,objects);
resourceId=textViewResourceId;
}
@Override
public View getView(int position, View convertView,ViewGroup parent) {
Fruit fruit = getItem(position);
//发生修改的地方
View view;
if (convertView == null) {
view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
} else {
view=convertView;
}
ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
TextView fruitName = (TextView) view.findViewById(R.id.fruit_name);
fruitImage.setImageResource(fruit.getImageId());
fruitName.setText(fruit.getName());
return view;
}
}
继续优化
ListView的点击事件
修改MainActivity中的代码:
public class MainActivity extends AppCompatActivity {
private List<Fruit> fruitList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
initFruit();
FruitAdapter adapter = new FruitAdapter(MainActivity.this, R.layout.fruit_item, fruitList);
ListView listView = (ListView) findViewById(R.id.list_view);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view,int position,long id) {
Fruit fruit = fruitList.get(position);
Toast.makeText(MainActivity.this, fruit.getName(), Toast.LENGTH_SHORT).show();
}
});
}
private void initFruit(){
for (int i = 0; i < 2; i++) {
Fruit apple = new Fruit("Apple", R.drawable.apple_pic);
fruitList.add(apple);
Fruit banana = new Fruit("Banana", R.drawable.banana_pic);
fruitList.add(banana);
Fruit orange = new Fruit("Orange", R.drawable.orange_pic);
fruitList.add(orange);
Fruit watermelon = new Fruit("Watermelon", R.drawable.watermelon_pic);
fruitList.add(watermelon);
Fruit pear = new Fruit("Pear", R.drawable.pear_pic);
fruitList.add(pear);
Fruit grape = new Fruit("Grape", R.drawable.grape_pic);
fruitList.add(grape);
Fruit pineapple = new Fruit("Pineapple", R.drawable.pineapple_pic);
fruitList.add(pineapple);
Fruit strawberry = new Fruit("Strawberry", R.drawable.strawberry_pic);
fruitList.add(strawberry);
Fruit cherry = new Fruit("Cherry", R.drawable.cherry_pic);
fruitList.add(cherry);
Fruit mango = new Fruit("Mango", R.drawable.mango_pic);
fruitList.add(mango);
}
}
}
出现问题:
- 此过程出现了一个异常:Out of memory: unable to create new native thread. Please fix the project's Gradle settings.
- 解决方法:File-->settings-->Build,Execution,Deployment-->Gradle-->Gradle home处设置gradle的位置到别的地方
- 图片太大会遮盖单词,所以要改尺寸