欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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();

效果图:

Android列表组件ListView使用详解之动态加载或修改列表数据

当前界面显示的代码:

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>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接