介绍

列表视图(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 的外观形式。常用的布局文件有以下几个:

  1.  simple_list_item_1:每个列表项都是一个普通的文本
  2.  simple_list_item_2:每个列表项都是一个普通的文本(字体略大)
  3.  simple_list_item_checked:每个列表项都有一个已选中的列表项
  4.  simple_list_item_multiple_choice:每个列表项都是带复选框的文本
  5.  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:

  1. 定义一个ImageView用于显示水果的图片
  2. 又定义一个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);
        }
    }
}

android 列表有哪些 安卓列表视图的类_ide

出现问题:

  • 此过程出现了一个异常: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的位置到别的地方
  • 图片太大会遮盖单词,所以要改尺寸