在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"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="80dp"
android:gravity="center"
android:text="购物商城"
android:textSize="40sp"
android:textColor="#FFF"
android:background="#FF8F03"/>
<ListView
android: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">
<ImageView
android:layout_width="180dp"
android:layout_height="146dp"
android:background="@drawable/apple"
android:id="@+id/iv_1" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/iv_1"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="苹果"
android:textSize="30sp"
android:textColor="#FF8F03"
android:id="@+id/tv_name"/>
<TextView
android: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"/>
<TextView
android: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;
@Override
protected 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{
@Override
public int getCount() {
return titles.length;
}
@Override
public Object getItem(int i) {
return titles[i];
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public 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。