经过前面几期的学习,关于ListView的一些基本用法大概学的差不多了,但是你可能发现了,所有ListView里面要填充的数据都是静态的,但在实际开发中,这些数据往往都是动态变化的,比如数据内容发生改变、增加几行、或者删除几行,这就涉及到ListView数据的更新问题。
接下来通过一个简单的示例程序来学习ListView的数据更新。
继续使用WidgetSample工程,在app/main/res/layout/目录下创建updatedata_layout.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" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_horizontal">
<Button
android:id="@+id/add_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加"/>
<Button
android:id="@+id/update_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="更新"/>
<Button
android:id="@+id/delete_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除"/>
<Button
android:id="@+id/clear_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清空"/>
</LinearLayout>
<TextView
android:id="@+id/empty_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="15dp"
android:textSize="15sp"
android:text="暂无数据"/>
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
由于当ListView没有数据时,整个页面一片白,非常难看,所以加了一个文本框,当列表没有数据时提示用户。然后添加了4个按钮来动态更新列表数据。
接着在res/layout/目录下新建一个updatedata_item.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:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
android:id="@+id/icon_img"
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="5dp"/>
<TextView
android:id="@+id/content_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp" />
</LinearLayout>
然后创建数据实体类UpdateData.java,主要用于显示在列表数据的实体,这里比较简单,包括一个图标ID和文本内容,代码如下:
package com.jinyu.cqkxzsxy.android.listviewsample.entity;
/**
* @创建者 鑫鱻
* @描述 Android零基础入门到精通系列教程,欢迎关注微信公众号ShareExpert
*/
public class UpdateData {
private int imgId;
private String content;
public UpdateData() {}
public UpdateData(int imgId, String content) {
this.imgId = imgId;
this.content = content;
}
public int getImgId() {
return imgId;
}
public String getContent() {
return content;
}
public void setImgId(int imgId) {
this.imgId = imgId;
}
public void setContent(String content) {
this.content = content;
}
}
再创建MyUpdateAdapter类,继承BaseAdapter,再另外添加几个方法,便于操作ListView。
package com.jinyu.cqkxzsxy.android.listviewsample.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.jinyu.cqkxzsxy.android.listviewsample.R;
import com.jinyu.cqkxzsxy.android.listviewsample.entity.UpdateData;
import java.util.LinkedList;
import java.util.List;
/**
* @创建者 鑫鱻
* @描述 Android零基础入门到精通系列教程,欢迎关注微信公众号ShareExpert
*/
public class MyUpdateAdapter extends BaseAdapter {
private Context mContext;
private List<UpdateData> mUpdateData;
public MyUpdateAdapter() {}
public MyUpdateAdapter( Context context, List<UpdateData> UpdateDatas) {
this.mUpdateData = UpdateDatas;
this.mContext = context;
}
/**
* 添加列表项
* @param position
* @param UpdateData
*/
public void add(int position, UpdateData UpdateData){
if (null == mUpdateData) {
mUpdateData = new LinkedList<>();
}
mUpdateData.add(position,UpdateData);
notifyDataSetChanged();
}
/**
* 更新列表内容
* @param UpdateDatas
*/
public void update(List<UpdateData> UpdateDatas){
if (null == mUpdateData) {
mUpdateData = new LinkedList<>();
}
mUpdateData.clear();
mUpdateData.addAll(UpdateDatas);
no