列表类组件ListView

介绍

列表视图(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);
        }
    }
}

出现问题:

  • 此过程出现了一个异常: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的位置到别的地方
  • 图片太大会遮盖单词,所以要改尺寸
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ListViewAndroid中用于显示列表数据的一个常用组件。一般情况下,我们需要使用适配器(Adapter)来为ListView提供数据和视图。 适配器是一个桥梁,它连接了数据源和ListViewListView通过适配器来获取数据并生成视图,然后将这些视图显示在屏幕上。适配器的主要作用就是将数据源中的数据转化为ListView中的视图。 在使用ListView时,我们需要完成以下几个步骤: 1. 创建ListView对象:通过findViewById()方法获取ListView对象,或者在布局文件中直接定义ListView。 2. 准备数据:我们需要先准备好要显示在ListView中的数据。数据可以来自于数据库、网络或本地文件等。 3. 创建适配器:创建一个适配器对象,并将数据源作为参数传递给适配器。适配器会将数据源中的数据转换为ListView中的视图。 4. 将适配器与ListView关联:使用setAdapter()方法将适配器与ListView关联起来。这样ListView就可以从适配器中获取数据并生成视图。 5. 为ListView设置点击事件:使用setOnItemClickListener()方法为ListView设置点击事件,当用户点击ListView中的某一项时,就会触发该事件。 6. 更新ListView数据:当数据源发生变化时,我们需要及时更新ListView的显示内容。可以通过调用适配器的notifyDataSetChanged()方法来实现。 下面是一个简单的ListView的例子: ``` // 创建ListView对象 ListView listView = findViewById(R.id.list_view); // 准备数据 List<String> dataList = new ArrayList<>(); dataList.add("Apple"); dataList.add("Banana"); dataList.add("Orange"); // 创建适配器 ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, dataList); // 将适配器与ListView关联 listView.setAdapter(adapter); // 为ListView设置点击事件 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 处理点击事件 String item = (String) parent.getItemAtPosition(position); Toast.makeText(MainActivity.this, "You clicked " + item, Toast.LENGTH_SHORT).show(); } }); // 更新ListView数据 dataList.add("Grape"); adapter.notifyDataSetChanged(); ``` 在这个例子中,我们首先创建了一个ListView对象,然后准备了一些数据,接着创建了一个ArrayAdapter适配器,并将其与ListView关联。最后,我们为ListView设置了点击事件,并更新了数据源,调用了适配器的notifyDataSetChanged()方法,从而更新了ListView的显示内容。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值