2019独角兽企业重金招聘Python工程师标准>>>

经过前面几期的学习,关于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" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:gravity="center_horizontal"><Buttonandroid:id="@+id/add_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="添加"/><Buttonandroid:id="@+id/update_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="更新"/><Buttonandroid:id="@+id/delete_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="删除"/><Buttonandroid:id="@+id/clear_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="清空"/></LinearLayout><TextViewandroid: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="暂无数据"/><ListViewandroid: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"><ImageViewandroid:id="@+id/icon_img"android:layout_width="48dp"android:layout_height="48dp"android:padding="5dp"/><TextViewandroid: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);notifyDataSetChanged();}/*** 更新列表项* @param position* @param UpdateData*/public void update(int position,UpdateData UpdateData){if(mUpdateData != null && position < mUpdateData.size()) {mUpdateData.set(position, UpdateData);}notifyDataSetChanged();}/*** 移除指定列表项* @param position*/public void remove(int position) {if(mUpdateData != null && 0 != getCount()) {mUpdateData.remove(position);}notifyDataSetChanged();}/*** 清空列表数据*/public void clear() {if(mUpdateData != null) {mUpdateData.clear();}notifyDataSetChanged();}@Overridepublic int getCount() {return mUpdateData.size();}@Overridepublic UpdateData getItem(int position) {return mUpdateData.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if(null == convertView){convertView = LayoutInflater.from(mContext).inflate(R.layout.updatedata_item, null);holder = new ViewHolder();holder.img_icon = (ImageView) convertView.findViewById(R.id.icon_img);holder.txt_content = (TextView) convertView.findViewById(R.id.content_tv);convertView.setTag(holder);}else{holder = (ViewHolder) convertView.getTag();}UpdateData UpdateData = getItem(position);holder.img_icon.setImageResource(UpdateData.getImgId());holder.txt_content.setText(UpdateData.getContent());return convertView;}private class ViewHolder{ImageView img_icon;TextView txt_content;}
}

接下来为ListView提供Adapter,使用自定义的BaseAdapter决定ListView所要显示的列表项,然后为4个按钮设置监听监听器。新建UpdateDataActivity.java文件,加载上面新建的布局文件,具体代码如下:

package com.jinyu.cqkxzsxy.android.listviewsample;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;import com.jinyu.cqkxzsxy.android.listviewsample.adapter.MyUpdateAdapter;
import com.jinyu.cqkxzsxy.android.listviewsample.entity.UpdateData;import java.util.LinkedList;
import java.util.List;public class UpdateDataActivity extends AppCompatActivity implements View.OnClickListener {private ListView mListView = null; // 列表private Button mAddBtn = null; // 添加列表项按钮private Button mUpdateBtn = null; // 更新列表按钮private Button mDeleteBtn = null; // 删除列表项按钮private Button mClearBtn = null; // 清空列表数据private MyUpdateAdapter mAdapter = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.updatedata_layout);// 获取界面组件mListView = (ListView) findViewById(R.id.listview);mAddBtn = (Button) findViewById(R.id.add_btn);mUpdateBtn = (Button) findViewById(R.id.update_btn);mDeleteBtn = (Button) findViewById(R.id.delete_btn);mClearBtn = (Button) findViewById(R.id.clear_btn);// 添加列表控内容视图View emptyView = findViewById(R.id.empty_tv);mListView.setEmptyView(emptyView);// 初始化列表List<UpdateData> datas = new LinkedList<UpdateData>();mAdapter = new MyUpdateAdapter(this, datas);mListView.setAdapter(mAdapter);// 设置按钮点击事件监听器mAddBtn.setOnClickListener(this);mUpdateBtn.setOnClickListener(this);mDeleteBtn.setOnClickListener(this);mClearBtn.setOnClickListener(this);}@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.add_btn:addItem();break;case R.id.update_btn:updateData();break;case R.id.delete_btn:deleteItem();break;case R.id.clear_btn:clearData();break;default:break;}}/*** 添加列表项*/private void addItem() {int position = getRandomPosition();mAdapter.add(position, new UpdateData(R.mipmap.ic_launcher, "随机添加" + position));}/*** 更新列表内容*/private void updateData() {int position = getRandomPosition();mAdapter.update(position, new UpdateData(R.mipmap.ic_launcher, "更新" + getRandomNumber()));}/*** 删除列表项*/private void deleteItem() {int position = getRandomPosition();mAdapter.remove(position);}/*** 清空列表数据*/private void clearData(){mAdapter.clear();}/*** 获取列表随机位置* @return*/private int getRandomPosition() {int count = mAdapter.getCount();return (int) (Math.random() * count);}/*** 获取100以内的随机数* @return*/private double getRandomNumber(){return Math.random() * 100;}
}

修改启动的Activity,运行程序,可以看到下面左图所示界面效果。

然后点击添加按钮,在列表中随机添加一些列表项,可以看到列表数据动态更新,如上图右侧所示。

然后再点击更新按钮,可以随机更新列表数据,如下图左侧所示。

再点击删除按钮,可以看到将会从列表中删除随机列表项,如上图右侧所示。

点击清空按钮,可以将列表所有数据全部清空,显示启动时的页面。

从以上几个操作,可以看到动态更新时离不开每次调用notifyDataSetChanged()方法,这个方法的主要作用就是当适配器里面的内容发生改变时需要强制调用getView()方法来刷新每个Item的内容。

今天就先到这里,如果有问题欢迎留言一起探讨,也欢迎加入Android零基础入门技术讨论微信群,共同成长!

此文章版权为微信公众号分享达人秀(ShareExpert)——鑫鱻所有,若需转载请联系作者授权,特此声明!

往期总结分享:

Android零基础入门第1节:Android的前世今生

Android零基础入门第2节:Android 系统架构和应用组件那些事

Android零基础入门第3节:带你一起来聊一聊Android开发环境

Android零基础入门第4节:正确安装和配置JDK, 高富帅养成第一招

Android零基础入门第5节:善用ADT Bundle, 轻松邂逅女神

Android零基础入门第6节:配置优化SDK Manager, 正式约会女神

Android零基础入门第7节:搞定Android模拟器,开启甜蜜之旅

Android零基础入门第8节:HelloWorld,我的第一趟旅程出发点

Android零基础入门第9节:Android应用实战,不懂代码也可以开发

Android零基础入门第10节:开发IDE大升级,终于迎来了Android Studio

Android零基础入门第11节:简单几步带你飞,运行Android Studio工程

Android零基础入门第12节:熟悉Android Studio界面,开始装逼卖萌

Android零基础入门第13节:Android Studio配置优化,打造开发利器

Android零基础入门第14节:使用高速Genymotion,跨入火箭时代

Android零基础入门第15节:掌握Android Studio项目结构,扬帆起航

Android零基础入门第16节:Android用户界面开发概述

Android零基础入门第17节:TextView属性和方法大全

Android零基础入门第18节:EditText的属性和使用方法

Android零基础入门第19节:Button使用详解

Android零基础入门第20节:CheckBox和RadioButton使用大全

Android零基础入门第21节:ToggleButton和Switch使用大全

Android零基础入门第22节:ImageView的属性和方法大全

Android零基础入门第23节:ImageButton和ZoomButton使用大全

Android零基础入门第24节:自定义View简单使用,打造属于你的控件

Android零基础入门第25节:简单且最常用的LinearLayout线性布局

Android零基础入门第26节:两种对齐方式,layout_gravity和gravity大不同

Android零基础入门第27节:正确使用padding和margin

Android零基础入门第28节:轻松掌握RelativeLayout相对布局

Android零基础入门第29节:善用TableLayout表格布局

Android零基础入门第30节:两分钟掌握FrameLayout帧布局

Android零基础入门第31节:少用的AbsoluteLayout绝对布局

Android零基础入门第32节:新推出的GridLayout网格布局

Android零基础入门第33节:Android事件处理概述

Android零基础入门第34节:Android中基于监听的事件处理

Android零基础入门第35节:Android中基于回调的事件处理

Android零基础入门第36节:Android系统事件的处理

Android零基础入门第37节:初识ListView

Android零基础入门第38节:初识Adapter

Android零基础入门第39节:ListActivity和自定义列表项

Android零基础入门第40节:自定义ArrayAdapter

Android零基础入门第41节:使用SimpleAdapter

Android零基础入门第42节:自定义BaseAdapter

Android零基础入门第43节:ListView优化和列表首尾使用

转载于:https://my.oschina.net/u/3598984/blog/1522751

Android零基础入门第44节:ListView数据动态更新相关推荐

  1. Android零基础入门第77节:Activity任务栈和启动模式

    2019独角兽企业重金招聘Python工程师标准>>> 通过前面的学习,Activity的基本使用都已掌握,接下来一起来学习更高级的一些内容. Android采用任务栈(Task)的 ...

  2. Android零基础入门第65节:RecyclerView分割线开发技巧

    2019独角兽企业重金招聘Python工程师标准>>> 在上一期通过简单学习,已经领略到了RecyclerView的灵活性,当然都是一些最基础的用法,那么本期一起来学习Recycle ...

  3. Android零基础入门第89节:Fragment回退栈及弹出方法

    2019独角兽企业重金招聘Python工程师标准>>> 在上一期分享的文章末尾留了一个课后作业,有去思考如何解决吗?如果已经会了那么恭喜你,如果还不会也没关系,本期一起来学习. 一. ...

  4. Android零基础入门第81节:Activity数据传递

    在Android开发中,经常要在Activity之间传递数据.前面也学习了Activity和Intent相关基础,接下来一起来学习Activity的数据传递. 一.简介 通过前面的学习知道,Inten ...

  5. Android零基础入门第83节:Activity间数据传递方法汇总

    2019独角兽企业重金招聘Python工程师标准>>> 在Activity间传递的数据一般比较简单,但是有时候实际开发中也会传一些比较复杂的数据,本节一起来学习更多Activity间 ...

  6. Android零基础入门第64节:揭开RecyclerView庐山真面目

    大家还记得之前在第38期~第50期都在学习列表控件吗,其中用了8期讲ListView的使用,相信都已经掌握好了吧.那么本期一起来学习Android 5.X新增的一个列表组件,那就是RecyclerVi ...

  7. Android零基础入门第68节:完善RecyclerView,添加首尾视图

    2019独角兽企业重金招聘Python工程师标准>>> 在之前学习ListView的时候,有学习过如何给ListView添加列表头和列表尾.但是通过近几期的学习,发现Recycler ...

  8. Android零基础入门第85节:Fragment使用起来非常简单

    2019独角兽企业重金招聘Python工程师标准>>> Fragment创建完成后并不能单独使用,还需要将Fragment加载到Activity中,在Activity中添加Fragm ...

  9. Android零基础入门第87节:Fragment添加、删除、替换

    2019独角兽企业重金招聘Python工程师标准>>> 前面一起学习了Fragment的创建和加载,以及其生命周期方法,那么接下来进一步来学习Fragment的具体使用,本期先来学习 ...

最新文章

  1. Depth graph
  2. 多媒体课程设计android,基于Android的多媒体播放器(课程设计)报告.doc
  3. 1370亿参数、接近人类水平,谷歌重磅推出对话AI模型LaMDA
  4. [译]GPU加持,TensorFlow Lite更快了
  5. linux系统硬盘坏道,如何在 Linux 系统下检测硬盘上的坏道和坏块
  6. 图论(九)最小生成树-Kruskal算法
  7. flask+sqlite3+echarts2+ajax数据可视化--静态图
  8. 微信终端自研 C++协程框架的设计与实现
  9. Atitit it行业图像处理行业软件行业感到到迷茫的三大原因和解决方案
  10. python打包成exe_Python打包成exe时,再犯这几个错误就说不过去了
  11. Maven实战 | dependencies与dependencyManagement
  12. 微软Surface Pro 8曝光:搭载第11代酷睿处理器和Win11系统
  13. Linux文档内容查询命令
  14. 【电路仿真】基于matlab simulink三相桥式全控整流电路【含Matlab源码 332期】
  15. django mysql 登陆界面_django 简单实现登录验证给你 Django用户登录验证跳转问题
  16. 关于XRD你知道多少
  17. 001 Joiner
  18. Java真的是低糖语言吗?
  19. TypeScript学习-类class
  20. 数据驱动故障诊断方法汇总

热门文章

  1. linux将b1内容重定向到b3,linux
  2. mysql安装samba_centos 安装samba
  3. android webview 填充,从Android使用WebView自动填充表格
  4. php开发的程序怎么用加密狗加密,C# 简单的程序绑定、加密(类似加密狗)
  5. SpringCloud_项目搭建以及Eureka
  6. 智慧农场基本情况交流会议记录
  7. 智能车竞赛视觉AI组总结 西南科技大学 – 西科二队
  8. 第十六届全国大学生智能车比赛掠影
  9. TEASOFT软件 | 动作帮助信息定义语法
  10. HX711双通道AD转换模块