自从RecyclerView出现后,ListView就被逐渐弃用了。但是这毕竟是我用了很久的东西,所以写下这篇文章简单讲解下其使用方法。
使用ListView需要三部分:
1.ListView控件本身。
2.item视图,这个可以用系统自带的。不过一般都是自定义,自定义也很简单,只需要创建一个Layout xml视图,内容可以自己定义。
3.Java类,添加一个Java类继承ArrayAdapter<Object object> ,Object是你传入的数据类型,可以是String,int,也可以是你自定义的类。
首先在布局文件里添加好ListView控件,然后创建一个自定义的布局文件
然后创建一个TestAdapter类继承ArrayAdapter<Person>,Person是自定义的一个类
添加完继承后会报错,这时候会有构造函数可以选择,选择这个构造函数
第一个参数是上下文,第二个是系统自带的item布局文件,第三个是你传入的数据
因为我们是自定义,所以更改构造函数
然后重写getView方法
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View listItemView=convertView;//显示在屏幕中的Item
/*
* ListView的每个Item出现在屏幕时都会执行该操作,为了防止每次都重复进行findViewById,
* 加入ViewHolder,里面含有Item中的控件,这样只需要进行一次findViewById,查找完毕后
* 用setTag方法储存ViewHolder,下次直接使用就行
* */
ViewHolder viewHolder=new ViewHolder();
if (listItemView==null){//如果该Item是第一次显示
listItemView= LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item,parent,
false);
viewHolder.ageTextView=listItemView.findViewById(R.id.list_item_age);
viewHolder.nameTextView=listItemView.findViewById(R.id.list_item_name);
listItemView.setTag(viewHolder);
}else {
viewHolder= (ViewHolder) listItemView.getTag();//直接获取ViewHolder对象
}
Person person=getItem(position);//获取指定位置的数据
viewHolder.nameTextView.setText(person.getmName());
viewHolder.ageTextView.setText(person.getmAge());
return listItemView;
}
public class ViewHolder{
public TextView nameTextView;
public TextView ageTextView;
}
然后在就可以进行最后的步骤了
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView=findViewById(R.id.list_view);
TestAdapter testAdapter=new TestAdapter(this,getData());
listView.setAdapter(testAdapter);
}
public List<Person> getData(){
List<Person>list=new ArrayList<>();
list.add(new Person("王二","28岁"));
list.add(new Person("张三","25岁"));
list.add(new Person("李四","29岁"));
list.add(new Person("赵五","20岁"));
return list;
}
而且,ListView有个setEmptyView方法,这个可以在没有数据的时候显示一个视图,可以用来提示用户当前没有数据
我们首先创建一个empty.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"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:text="暂无数据"/> </LinearLayout>
然后修改MainActivity.class
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView listView=findViewById(R.id.list_view); TestAdapter testAdapter=new TestAdapter(this,new ArrayList<Person>()); listView.setAdapter(testAdapter); View emptyView= LayoutInflater.from(this).inflate(R.layout.empty,null); addContentView(emptyView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); listView.setEmptyView(emptyView); }
然后就会显示
这样就OK了!