ListView是一个垂直显示信息的一个界面,他相当于一个容器,可以容纳很多个Layout用来显示复杂的消息。
上图可以简单说明他们之间的关系。
在使用ListView之前我们需要新建一个布局文件并且加入我们要使用的ListView控件;代码如下:
在创建好ListView之后我们还需要为他创建填充项,也就是第一张图中的黄色方框,每个填充其实都是一个Layout布局文件,我们只需要创建好一个,剩下的就交给代码实现。
创建一个空的XML文件,或者布局文件命名规则一般为XX_list_item(这是我个人习惯哈)
可以看到上述文件我创建了一个线性布局,包含了两个TextView用来显示数据,当然这个是可以自定义的。
以上就是界面的所有代码了,下面开始写代码部分,
我们首先创建一个类,用来封装需要用到的数据,比如我的填充布局中有两个文本框,那么我就至少需要两个变量来填充,我这里创建一个名为TextModel的类,可以不用get、set来封装属性。(听说安卓源码里面也是?)
public class NoteModel {
public String note;
public String date;
public String userid;
}
有了上面的类还不够想往ListView中填充数据的话,需要另一个类来帮助他,这个类就是ListAdapter类,不过这个类是一个接口,这里需要我们创建一个类来继承他的实现类(BaseAdapter)
public class MyAdapter extends BaseAdapter {
Context context;
List textModelList;
//数据适配器类 填充数据
public MyAdapter(Context context, List textModelList) {
this.context = context;
this.textModelList= textModelList;
}
@Override
public int getCount() {
return textModelList.size();
}
@Override
public NoteModel getItem(int i) {
return textModelList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
View review = view;
TextView tv_date;
TextView tv_note;
if (review == null) {
view = LayoutInflater.from(context).inflate(R.layout.note_list_item, null);
review=view
}
else {
review=view;
}
tv_date = review.findViewById(R.id.tv_date);
tv_note = review.findViewById(R.id.tv_note);
tv_date.setText(textModelList.get(i).date);
tv_note.setText(textModelList.get(i).note);
return view;
}
}
继承了BaseAdapter以后需要重写getCount(); getItem(); getItemId();getView();
getCount()方法是用来获取需要填充的Item一共有多少个,我们这里创建了构造函数传进来一个List集合存放着若干TextModel对象,每一个对象都用来填充一个Item.所以返回这个List的数量就是ListView一共需要多少个Item子项。
getItem();一般用于点击ListView事件,该方法根据当前点击的ItemId返回一个TextModel对象,可以用来获取数据。
getItemID()一般用于点击ListView事件,该方法根据当前点击的Item,返回一个id该Id可以定位具体哪一个item被点击;
getView();最重要的一个方法,ListView每次新增都会调用一次这个方法,三个参数分别为ItemId,view(每次调用会带着上一次的view对象进来,若是第一次则为空)方法内比较重要的语句就是view = LayoutInflater.from(context).inflate(R.layout.note_list_item);该语句可以通过布局文件去创建一个view对象,再通过view对象找到布局内对应的控件进行赋值,以显示。
上述工作都做好以后该如何使用呢?
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.note_list);
listView = findViewById(R.id.lv_note_list);
textModelList= XmlReader.getNotesFormXml(this);//通过XML文件初始化List集合,大家也可以自己选择方式填充其他数据
if (noteModelList != null) {
MyAdapter myAdapter = new ListFill(this, textModelList);
listView.setAdapter(myAdapter);
listView.setOnItemClickListener(this);
} else
Toast.makeText(this, "加载失败", Toast.LENGTH_SHORT).show();
}
上述代码是我个人使用的时候填写的基本上和其他控件一样,绑定好以后最后一步listView.setAdapter(myAdapter);即可