[Android新手学习笔记23]-如何使用ListView展示列表数据

来源:互联网 发布:云电视直播软件 编辑:程序博客网 时间:2024/06/01 20:35

基本配置:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.    android:orientation="vertical"
  4.    android:layout_width="match_parent"
  5.    android:layout_height="match_parent">
  6.    <ListView
  7.        android:id="@+id/list_view"
  8.        android:layout_width="match_parent"
  9.        android:layout_height="match_parent" />
  10. </LinearLayout>

设置Adapter:

  1. public class MainActivity extends AppCompatActivity {
  2.    private String[] data = {
  3.            "草莓",
  4.            "梨",
  5.            "芒果",
  6.            "苹果",
  7.            "西瓜",
  8.            "香蕉",
  9.            "樱桃",
  10.    };
  11.    @Override
  12.    protected void onCreate(Bundle savedInstanceState) {
  13.        super.onCreate(savedInstanceState);
  14.        setContentView(R.layout.activity_main);
  15.        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
  16.                MainActivity.this, android.R.layout.simple_list_item_1, data
  17.        );
  18.        ListView listView = (ListView) findViewById(R.id.list_view);
  19.        listView.setAdapter(adapter);
  20.    }
  21. }

自定义ListView:

1.数据类

定义一个Fruit类:

  1. public class Fruit {
  2.    private String name;
  3.    private int imageId;
  4.    public Fruit(String name, int imageId) {
  5.        this.name = name;
  6.        this.imageId = imageId;
  7.    }
  8.    public String getName() {
  9.        return this.name;
  10.    }
  11.    public int getImageId() {
  12.        return this.imageId;
  13.    }
  14. }

2.自定义ListView布局

新建布局文件:fruit_item.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3.    xmlns:android="http://schemas.android.com/apk/res/android"
  4.    android:orientation="horizontal"
  5.    android:layout_width="match_parent"
  6.    android:layout_height="match_parent">
  7.    <ImageView
  8.        android:id="@+id/fruit_image"
  9.        android:layout_width="60dp"
  10.        android:layout_height="60dp" />
  11.    <TextView
  12.        android:id="@+id/fruit_name"
  13.        android:textSize="30sp"
  14.        android:gravity="center_vertical"
  15.        android:layout_width="0dp"
  16.        android:layout_weight="1"
  17.        android:layout_marginLeft="10dp"
  18.        android:layout_height="60dp" />
  19. </LinearLayout>

3.Adapter

新建FruitAdapter类继承ArrayAdapter<Fruit>:

  1. public class FruitAdapter extends ArrayAdapter<Fruit> {
  2.    private int resourceId;
  3.    public FruitAdapter(Context context, int textViewResourceId, List<Fruit> objects) {
  4.        super(context, textViewResourceId, objects);
  5.        resourceId = textViewResourceId;
  6.    }
  7.    @NonNull
  8.    @Override
  9.    public View getView(int position, View convertView, ViewGroup parent) {
  10.        Fruit fruit = getItem(position); // 获取当前项的Fruit实例
  11.        View view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
  12.        ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
  13.        TextView fruitName = (TextView) view.findViewById(R.id.fruit_name);
  14.        fruitImage.setImageResource(fruit.getImageId());
  15.        fruitName.setText(fruit.getName());
  16.        return view;
  17.    }
  18. }

4.使用

初始化数据,创建FruitAdapter,设置adapter:

  1. public class MainActivity extends AppCompatActivity {
  2.    private List<Fruit> fruitList = new ArrayList<>();
  3.    @Override
  4.    protected void onCreate(Bundle savedInstanceState) {
  5.        super.onCreate(savedInstanceState);
  6.        setContentView(R.layout.activity_main);
  7.        initFruits();
  8.        FruitAdapter adapter = new FruitAdapter(MainActivity.this, R.layout.fruit_item, fruitList);
  9.        ListView listView = (ListView) findViewById(R.id.list_view);
  10.        listView.setAdapter(adapter);
  11.    }
  12.    private void initFruits() {
  13.        Fruit strawberry = new Fruit("草莓", R.drawable.strawberry);
  14.        fruitList.add(strawberry);
  15.        Fruit pear = new Fruit("梨", R.drawable.pear);
  16.        fruitList.add(pear);
  17.        Fruit mango = new Fruit("芒果", R.drawable.mango);
  18.        fruitList.add(mango);
  19.        Fruit apple = new Fruit("苹果", R.drawable.apple);
  20.        fruitList.add(apple);
  21.        Fruit watermelon = new Fruit("西瓜", R.drawable.watermelon);
  22.        fruitList.add(watermelon);
  23.        Fruit banana = new Fruit("香蕉", R.drawable.banana);
  24.        fruitList.add(banana);
  25.        Fruit cherry = new Fruit("樱桃", R.drawable.cherry);
  26.        fruitList.add(cherry);
  27.    }
  28. }

性能优化:

  1. @Override
  2.    public View getView(int position, View convertView, ViewGroup parent) {
  3.        Fruit fruit = getItem(position); // 获取当前项的Fruit实例
  4.        View view;
  5.        if (convertView == null) {
  6.            view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
  7.        } else {
  8.            view = convertView;
  9.        }
  10.        ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
  11.        TextView fruitName = (TextView) view.findViewById(R.id.fruit_name);
  12.        fruitImage.setImageResource(fruit.getImageId());
  13.        fruitName.setText(fruit.getName());
  14.        return view;
  15.    }

convertView参数,用于将之前加载好的布局进行缓存,这样不会再重复去加载布局。

新增一个内部类ViewHolder,用于对控件的实例进行缓存。就不用每次都通过findViewById()方法来获取实例了。

最终实现代码如下:

  1. public class FruitAdapter extends ArrayAdapter<Fruit> {
  2.    private int resourceId;
  3.    public FruitAdapter(Context context, int textViewResourceId, List<Fruit> objects) {
  4.        super(context, textViewResourceId, objects);
  5.        resourceId = textViewResourceId;
  6.    }
  7.    @NonNull
  8.    @Override
  9.    public View getView(int position, View convertView, ViewGroup parent) {
  10.        Fruit fruit = getItem(position); // 获取当前项的Fruit实例
  11.        View view;
  12.        ViewHolder viewHolder;
  13.        if (convertView == null) {
  14.            view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
  15.            viewHolder = new ViewHolder();
  16.            viewHolder.fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
  17.            viewHolder.fruitName = (TextView) view.findViewById(R.id.fruit_name);
  18.            view.setTag(viewHolder); // 将viewHolder存储在View中
  19.        } else {
  20.            view = convertView;
  21.            viewHolder = (ViewHolder) view.getTag(); // 重新获取viewHolder
  22.        }
  23.        viewHolder.fruitImage.setImageResource(fruit.getImageId());
  24.        viewHolder.fruitName.setText(fruit.getName());
  25.        return view;
  26.    }
  27.    class ViewHolder {
  28.        ImageView fruitImage;
  29.        TextView fruitName;
  30.    }
  31. }

增加ListView点击事件:

  1. listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  2.    @Override
  3.    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  4.        Fruit fruit = fruitList.get(position);
  5.        Toast.makeText(MainActivity.this, fruit.getName(), Toast.LENGTH_SHORT).show();
  6.     }
  7. });

0 0