ListView用法简单学习

来源:互联网 发布:java的发展方向 编辑:程序博客网 时间:2024/06/07 13:01

写了几篇博客,感觉效果还可以,但是想换个方式。之前写的像流水账,感觉首先题目就不好,都是一个题目加个序号让人不知道内容是什么,其次是每一篇着重研究一个知识点就可以,内容更加有针对性。所以从这一片开始换一种写法。

我们的目标是建立一个条目可以滚动的程序。需要使用ListView,大致分为四步:
1.建立子项(条目)类
2.制作子项布局
3.建立适配器类
4.在活动中调用适配器与布局

1.建立子项(条目)类

定义一个实体类,作为ListView适配器的适配类型。例如新建类Fruit,代码如下:

package com.example.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;    }}

可知:我们把子项抽象成了一个类,在这个类中有子项的多有内容,并且还提供了子项的构造方法以及获取子项内容的方法,图片内容返回的是id。

2.下面应该位子项创建布局:
这里我们的子项有两项内容,一个是水果名称String name,另一个是水果的图片,所以每一个子项布局应该有一个TextView,和一个ImageView。

<?xml version="1.0" encoding="utf-8"?><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"        android:layout_marginLeft="10dip" /></LinearLayout>

3.创建一个自定义适配器
这个适配器需要继承ArrayAdapter,并且将泛型指定为子项的类,在这里既是Fruit类。所以新建适配器类FruitAdapter:

package com.example.listview;import java.util.List;import com.example.listview.Fruit;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.ImageView;import android.widget.TextView;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 = LayoutInflater.from(getContext()).inflate(resourceId, null);        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.setTag(viewHolder);        } else {            view = convertView;            viewHolder = (ViewHolder) view.getTag();        }        /*        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());        */        viewHolder.fruitImage.setImageResource(fruit.getImageId());        viewHolder.fruitName.setText(fruit.getName());        return view;    }    class ViewHolder {        ImageView fruitImage;        TextView fruitName;    }}

类中,首先申明了一个resourceId变量用来储存资源文件的Id,重写了构造方法,传入三个参数,分别是是下文,资源文件Id与子项的类的实例,构造函数首先调用父类的构造方法,然后将资源Id赋值给resourceId。
同时,适配器类还提供了一个getView方法,在自定义时应当重写。getView方法就是用来显示被滚动到屏幕可见区域的子项(当然了显示才能看见,明白意思就好),这个函数需要向内传递三个参数,分别是int position表示item的第几条从0开始,View convertView就是item上的布局layout或者组件的旧视图,ViewGroup parent是此视图最终会被附加到的父级视图。
具体到这个项目之中,首先声明一个Fruit类的实例fruit引用,并用getItem方法进行获取所在位置的实例赋给fruit。
之后,想要载入界面。对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;对于一个已经载入的界面,就可以使用Activity.findViewById()方法来获得其中的界面元素。
我们想要获得View的实例,先要获得LayoutInflater实例:

1. LayoutInflater inflater = getLayoutInflater();//调用Activity的getLayoutInflater() 2. LayoutInflater inflater = LayoutInflater.from(context);  3. LayoutInflater inflater =  (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

这三种方法其实是一样的,本质是都是调用的Context.getSystemService()。
之后再调用inflate方法,inflate方法有多种方法重载,详情看这里,这里一般使用如下:

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

传入两个参数,分别是资源Id与null,关于参数可以看这里
这样就获得了了当前子项的View实例。
下一步,我们子项各个内容的实例,使用上一步所获得的view实例,调用它的findViewById方法进行获取view对象并进行向下转型,在这里我们获得ImageView与TextView实例各一个。

        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());

最后我们把资源或者资源Id赋给获得的View子类对象。、

4.在活动中调用适配器以显示ListView布局
首先生命一个List泛型为子项类:

    private List<Fruit> fruitList = new ArrayList<Fruit>();

该List是一个ArrayList,之后写一个初始化子项类与列表的函数:

    private void initFruits() {        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);    }

这样每个子项都可以初始化完成也都加载进List,在onCreate方法中调用此方法以初始化。并且声明并建立一个FruitAdapter的对象adapter:

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

可以看出,构造方法中传递的是本类地对象,每个子项的布局文件,以及子项类的集合。
再然后,创建一个列表布局对象,传入参数为列表布局文件,最后使用setAdapter方法将将适配器与列表布局对象进行适配;

        ListView listView = (ListView) findViewById(R.id.list_view);        listView.setAdapter(adapter);

至此,运行程序,一个可以滚动的列表就生成了。

0 0
原创粉丝点击