Android列表组件ListView使用详解之动态加载或修改列表数据
程序员文章站
2022-07-04 20:28:43
在使用listview组件来显示列表数据时,有的时候我们需要改变列表中的数据,有以下方法:
1、重新给listview组件设置适配器
这种方法重新创建了listview...
在使用listview组件来显示列表数据时,有的时候我们需要改变列表中的数据,有以下方法:
1、重新给listview组件设置适配器
这种方法重新创建了listview,效率不好。
2、使用适配器中的方法
/** * notifies the attached observers that the underlying data has been changed * and any view reflecting the data set should refresh itself. */ public void notifydatasetchanged() { mdatasetobservable.notifychanged(); }
这种方法旨在告知适配器,listview中的数据源发生变化,需要重新加载新的数据,不会重新创建listview。使用此方法时,需要确保使用的是同一数据存储对象,只是存储对象中的值发生变化,才能使改动生效。关键代码如下:
listviewdemoadapter.notifydatasetchanged();
效果图:
当前界面显示的代码:
package net.oschina.git.zhaikun.androiddeveloped.activitys; import android.os.bundle; import android.support.annotation.nullable; import android.support.v7.app.appcompatactivity; import android.view.view; import android.widget.button; import android.widget.listview; import net.oschina.git.zhaikun.androiddeveloped.r; import net.oschina.git.zhaikun.androiddeveloped.adapter.listviewdemoadapter; import java.util.arraylist; import java.util.list; /** * created by zhaikun68 on 2018/3/5. * <p> * listview演示demo */ public class listviewdemoactivity extends appcompatactivity implements view.onclicklistener { private listview testlv;//listview组件 private button updatedatabtn;//动态加载数据组件 private list<string> datalist = new arraylist<>();//存储数据 private listviewdemoadapter listviewdemoadapter;//listview的数据适配器 @override protected void oncreate(@nullable bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_listview_demo); initview();//初始化组件 initdata();//初始化数据 } /** * 初始化组件 */ private void initview() { testlv = (listview) findviewbyid(r.id.test_lv); updatedatabtn = (button) findviewbyid(r.id.update_data_btn); updatedatabtn.setonclicklistener(this); } /** * 初始化数据 */ private void initdata() { //初始化10项数据 for (int i = 1; i <= 20; i++) { datalist.add("显示内容" + i); } //设置listview的适配器 listviewdemoadapter = new listviewdemoadapter(this, datalist); testlv.setadapter(listviewdemoadapter); testlv.setselection(4); } @override public void onclick(view v) { switch (v.getid()) { case r.id.update_data_btn://动态加载列表数据 datalist.add("动态加载的数据项"); //通知listview更改数据源 if (listviewdemoadapter != null) { listviewdemoadapter.notifydatasetchanged(); testlv.setselection(datalist.size() - 1);//设置显示列表的最后一项 } else { listviewdemoadapter = new listviewdemoadapter(this, datalist); testlv.setadapter(listviewdemoadapter); testlv.setselection(datalist.size() - 1); } break; } } }
界面布局文件:
<?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"> <button android:id="@+id/update_data_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignparentbottom="true" android:layout_margin="10dp" android:text="动态加载数据"/> <listview android:id="@+id/test_lv" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@id/update_data_btn" android:divider="@color/colorprimarydark" android:dividerheight="3dp" android:listselector="#ff0000" android:scrollbars="none"/> </relativelayout>
适配器代码:
package net.oschina.git.zhaikun.androiddeveloped.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 net.oschina.git.zhaikun.androiddeveloped.r; import java.util.list; /** * created by zhaikun68 on 2018/3/5. * <p> * listview演示demo中的数据适配器 */ public class listviewdemoadapter extends baseadapter { private context context;//上下文对象 private list<string> datalist;//listview显示的数据 /** * 构造器 * * @param context 上下文对象 * @param datalist 数据 */ public listviewdemoadapter(context context, list<string> datalist) { this.context = context; this.datalist = datalist; } @override public int getcount() { return datalist == null ? 0 : datalist.size(); } @override public object getitem(int position) { return datalist.get(position); } @override public long getitemid(int position) { return position; } @override public view getview(int position, view convertview, viewgroup parent) { viewholder viewholder; //判断是否有缓存 if (convertview == null) { convertview = layoutinflater.from(context).inflate(r.layout.item_listview_demo, null); viewholder = new viewholder(convertview); convertview.settag(viewholder); } else { //得到缓存的布局 viewholder = (viewholder) convertview.gettag(); } //设置图片 viewholder.pictureimg.setimageresource(r.mipmap.ic_launcher); //设置内容 viewholder.contenttv.settext(datalist.get(position)); return convertview; } /** * viewholder类 */ private final class viewholder { imageview pictureimg;//图片 textview contenttv;//内容 /** * 构造器 * * @param view 视图组件(listview的子项视图) */ viewholder(view view) { pictureimg = (imageview) view.findviewbyid(r.id.picture_img); contenttv = (textview) view.findviewbyid(r.id.content_tv); } } }
列表子项的布局文件:
<?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="wrap_content" android:orientation="horizontal" android:padding="5dp"> <imageview android:id="@+id/picture_img" android:layout_width="30dp" android:layout_height="30dp" android:layout_marginright="5dp" android:src="@mipmap/ic_launcher"/> <textview android:id="@+id/content_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:text="显示内容"/> </linearlayout>
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接