Android:ListView用法

1 ListView 的简单用法

创建listview项目

布局文件

    <ListView
          android:id="@+id/lv_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    </ListView>

MainActiviy
1. 设置数据
2. 初始化listview 对象
3. 创建Adapter
4. ListView设置Adapter

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //1. 
        String []data = {"item1","item2","item3","item4","item5","item6"};
        //2.
        ListView lv_list = (ListView) findViewById(R.id.lv_list);
        //3.
        ArrayAdapter<String> adapter = new ArrayAdapter<>(MainActivity.this,android.R.layout.simple_list_item_1,data);
        //4. 
        lv_list.setAdapter(adapter);
}

效果

这里写图片描述

2 自定义Adapter

2.1 设置数据对应的bean

创建水果对应的bean对象

public class Fruit {
    private  String name;
    private  int imageid;

    public Fruit() {
    }

    public Fruit(String name, int imageid) {
        this.name = name;
        this.imageid = imageid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getImageid() {
        return imageid;
    }

    public void setImageid(int imageid) {
        this.imageid = imageid;
    }
}

2.2 设置数据对象对应的item布局文件

数据对象对应的item布局文件 fruit_list.xml

<?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"

    android:orientation="horizontal">

    <ImageView
        android:id="@+id/iv_fruit_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView

        android:layout_marginLeft="20dp"
        android:gravity="center_vertical"
        android:textSize="30sp"
        android:id="@+id/tv_fruit_item"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

2.3 创建自定义Adapter

创建自定义Adapter
1. 重写构造方法
2. 重写getView() 函数


public class FruitAdapter extends ArrayAdapter<Fruit> {


    private int resourceid;

    //1. 
    public FruitAdapter(@NonNull Context context, @LayoutRes int resource, @NonNull List<Fruit> objects) {
        super(context, resource, objects);
        resourceid = resource;
    }

    //2.
    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        //return super.getView(position, convertView, parent);
        Fruit fruit = getItem(position);
        View view = LayoutInflater.from(getContext()).inflate(resourceid, null);

        ImageView imageView = (ImageView) view.findViewById(R.id.iv_fruit_item);
        TextView textView = (TextView) view.findViewById(R.id.tv_fruit_item);

        imageView.setImageResource(fruit.getImageid());
        textView.setText(fruit.getName());
        return view;
    }
}

2.4 MainActivity 中为Listview 设置adapter

MainActivity
1. 初始化数据
2. 设置adapter


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //1. 出事話數據
        initFruits();
        ListView lv_list = (ListView) findViewById(R.id.lv_list);
        //2 初始化adapter
        FruitAdapter fruitadapter = new FruitAdapter(MainActivity.this,R.layout.fruit_item,fruitList);

        //3. 设置adapter
        lv_list.setAdapter(fruitadapter);
    }

初始化数据


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

    }

效果图:

这里写图片描述

3 提升 ListView 的运行效率

getView()方
法中还有一个 convertView 参数,这个参数用于将之前加载好的
布局进行缓存,以便之后可以进行重用。

修改FruitAdapter.class

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
         *优化view 二
         Fruit fruit = getItem(position);

         View view = null;
         //重用
         if (convertView == null) {
         view = LayoutInflater.from(getContext()).inflate(resourceid, null);
         } else {
         view = convertView;
         }

         ImageView imageView = (ImageView) view.findViewById(R.id.iv_fruit_item);
         TextView textView = (TextView) view.findViewById(R.id.tv_fruit_item);

         imageView.setImageResource(fruit.getImageid());
         textView.setText(fruit.getName());
         return view;
}

4 使用ViewHolder 优化listview

虽虽然现在已经不会再重复去加载布局,
但是每次在 getView()方法中还是会调用 View的 findViewById()方法来获取一次控件的实例。
我们可以借助一个 ViewHolder 来对这部分性能进行优化,修改 FruitAdapter 中的代码,如下
所示:


    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
       /*优化 三使用handler
         *虽然现在已经不会再重复去加载布局,
         但是每次在 getView()方法中还是会调用 View的 findViewById()方法来获取一次控件的实例。
         我们可以借助一个 ViewHolder 来对这部分性能进行优化,修改 FruitAdapter 中的代码,如下
         所示:
         */
        Fruit fruit = getItem(position);

        View view = null;
        ViewHolder viewholder;

        if (convertView == null) {
            view = LayoutInflater.from(getContext()).inflate(resourceid, null);


            viewholder = new ViewHolder();
            viewholder.fruitImage = view.findViewById(R.id.iv_fruit_item);
            viewholder.fruitName = view.findViewById(R.id.tv_fruit_item);

            view.setTag(viewholder);//将viewholder 存储哦在view 中

        } else {
            view = convertView;
            viewholder = (ViewHolder) view.getTag();//重新获取viewholder


        }


        viewholder.fruitImage.setImageResource(fruit.getImageid());
        viewholder.fruitName.setText(fruit.getName());

        return view;


    }

    class ViewHolder {
        ImageView fruitImage;
        TextView fruitName;
    }

最终效果

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值