在Android开发中,ListView是一个比较常用的控件,它以列表的形式展示数据内容,并且能够根据列表的高度自适应屏幕显示。ListView的样式是由属性决定的,它的常用属性如下所示
android:listSelector
点击后改变背景颜色

android:divider
设置分割线的颜色(配合android:dividerHeight使用)

android:dividerHeight
设置分割线的高度
我给弄宽点

android:scrollbars
是否显示滚动条
android:requiresFadingEdge
渐变阴影

使用listview需要数据适配器来传输数据
数据适配器是数据与视图之间的桥梁,它类似于一个转换器,将复杂的数据转换成用户可以接受的方式进行呈现。
常用的数据适配器:
BaseAdapter:基本的适配器
SimpleAdapter:继承自BaseAdapter
ArrayAdapter:也是BaseAdapter的子类
BaseAdapter
BaseAdapter顾名思义是基本的适配器。它实际上是一个抽象类,通常在自定义适配器时会继承BaseAdapter,该类拥有四个抽象方法,根据这几个抽象方法对ListView控件进行数据适配。BaseAdapter中的4个抽象方法如下所示
public int getCount() | 获取列表的条数 |
public Object getItem(int position) | 获取该位置(position)的对象 |
public long getItemId(int position) | 获取该位置(position)对象的id |
public View getView(int position, View convertView, ViewGroup parent) | 获取相应position对应的条目视图,position是当前条目的位置,convertView用于复用旧视图,parent用于加载XML布局。 |
接下来我们通过一个购物商城的案例来演示如何通过ListView控件与数据适配器显示一个商品信息的列表。本案例的界面效果如下图所示。

主界面的xml布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="80dp"android:gravity="center"android:text="购物商城"android:textSize="40sp"android:textColor="#FFF"android:background="#FF8F03"/><ListViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/lv"/>
</LinearLayout>
每一个条目的布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:padding="15dp"><ImageViewandroid:layout_width="180dp"android:layout_height="146dp"android:background="@drawable/apple"android:id="@+id/iv_1" /><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_toRightOf="@+id/iv_1"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="苹果"android:textSize="30sp"android:textColor="#FF8F03"android:id="@+id/tv_name"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="价格:"android:textSize="30sp"android:textColor="#FF8F03"android:id="@+id/tv_1"android:layout_below="@id/tv_name"android:layout_marginTop="30dp"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_toRightOf="@id/tv_1"android:layout_alignTop="@id/tv_1"android:textSize="30sp"android:textColor="#FF8F03"android:id="@+id/tv_prise"android:text="66yuan"/></RelativeLayout></RelativeLayout>
后端代码实现
package com.example.listview;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {private String[]titles={"桌子","苹果","蛋糕","线衣","猕猴桃","围巾"};private String[]prices = {"1800元", "10元/kg", "300元", "350元", "10元/kg","280元"};private int[]icons={R.drawable.table,R.drawable.apple,R.drawable.cake,R.drawable.wireclothes,R.drawable.kiwifruit,R.drawable.scarf};private ListView listView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listView=findViewById(R.id.lv);myAdapter myAdapter=new myAdapter();listView.setAdapter(myAdapter);}class myAdapter extends BaseAdapter{@Overridepublic int getCount() {return titles.length;}@Overridepublic Object getItem(int i) {return titles[i];}@Overridepublic long getItemId(int i) {return i;}@Overridepublic View getView(int i, View view, ViewGroup viewGroup) {ViewHolder viewHolder=new ViewHolder();if (view==null){view=View.inflate(MainActivity.this,R.layout.list_item,null);viewHolder.iv=view.findViewById(R.id.iv_1);viewHolder.title=view.findViewById(R.id.tv_name);viewHolder.price=view.findViewById(R.id.tv_prise);view.setTag(viewHolder);}else {viewHolder=(ViewHolder) view.getTag();}viewHolder.price.setText(prices[i]);viewHolder.title.setText(titles[i]);viewHolder.iv.setBackgroundResource(icons[i]);return view;}class ViewHolder{TextView title,price;ImageView iv;}}
}
效果图


这个是把要更改的一些东西搞成数组。

这是将条目那一堆东西合在一块变成一个view对象。

如果没有就新建一个view
利用viewholder里面的属性来对view里面的控件逐一监听
最后给这个view打个标签,方便下一次viewholder直接在标签里面取。

直接gettag直接获取上一个view,相当于复用view

重新设定具体值,ok。