自定义listView及其adapter动态刷新

2024-06-18 01:58

本文主要是介绍自定义listView及其adapter动态刷新,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文地址  http://www.cnblogs.com/youjun/archive/2012/03/13/2392718.html


本文主要探讨自定义的adapter及其notifyDataSetChanged()方法的使用(无listView的监听部分):

先上图看下效果:(整个操作过程中,当前Activity未被pause或者stop, 豌豆荚截的图真大....无语)

1,初始化状态,共20个dataItem

2, 15秒后向下滑动,增加了一个text100的item:

3,点击添加后,向下滑动,增加了一个text200的item(每点一次添加按钮就会增加一个text200的item):

4,点击删除按钮,上下滑动(每点一次,listView中的item就减少一个):

 

代码部分未贴完整,有简要注释,未考虑优化

adapter.xml:

复制代码
<ListView
android:id="@+id/listview1"
android:layout_width
="fill_parent"
android:layout_height
="0dp"
android:layout_weight
="1"
android:cacheColorHint
="#00000000" />

<LinearLayout
android:layout_width="fill_parent"
android:layout_height
="wrap_content"
android:orientation
="horizontal"
>

<Button
android:id="@+id/button_add"
android:layout_width
="0dp"
android:layout_height
="wrap_content"
android:layout_weight
="1"
android:text
="添加" >
</Button>

<Button
android:id="@+id/button_delete"
android:layout_width
="0dp"
android:layout_height
="wrap_content"
android:layout_weight
="1"
android:text
="删除" >
</Button>
</LinearLayout>
复制代码

<ListView/>标签中属性android:layout_height="0dp"和android:layout_weight="1"保证了Android平台在布局时会先计算其他元素(linearLayout)的宽高,再计算当前listView的宽高等属性,因android:layout_weight="XXX"默认值为0, 1的优先级要比0低(如果整个xml是RelativeLayout布局,就easy了,有直接的属性可以设置)

两个<Button/>标签中的属性android:layout_weight="1"和android:layout_width="0dp",使得他们的父元素在布局时,为他们平均分配空间,如果在其中一个<Button/>设置了间隔,如android:layout_marginLeft = "xxxdp",那么父元素会先减去此间隔xxxdp,剩下空间依旧平均分配给两个button按钮

如图:

 

 

adapter_item.xml:

复制代码
<TextView
android:id="@+id/textview1"
android:layout_width
="wrap_content"
android:layout_height
="wrap_content"
android:textColor
="#FF0000"
android:textSize
="25dp" />

<Button
android:id="@+id/button1"
android:layout_width
="wrap_content"
android:layout_height
="wrap_content"
android:layout_marginLeft
="150dp"
android:focusable
="false" />
复制代码

 

Activity类AdapterActivity:

复制代码
public class AdapterActivity extends Activity {

private ListView listView;

private List<HashMap<String, String>> data;

private ListViewAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.adapter);

listView = (ListView) findViewById(R.id.listview1);

Button addButton = (Button) findViewById(R.id.button_add);
Button deleteButton = (Button) findViewById(R.id.button_delete);
ButtonListener listener = new ButtonListener();
addButton.setOnClickListener(listener);
deleteButton.setOnClickListener(listener);

this.initListView();

Timer timer = new Timer();
timer.schedule(new TimerTask() {// 15秒后向data集合中增加一条数据
@Override
public void run() {
HashMap<String, String> map = new HashMap<String, String>();
map.put("text", "text100");
map.put("buttonText", "buttonText100");
data.add(map);
Log.i(Constant.TAG, "添加数据成功");

// adapter.notifyDataSetChanged(); 非UI线程报错

Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
}
}, 15000);
}

private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// super.handleMessage(msg);
switch (msg.what) {
case 1:
// UI线程中调用此方法通知观察者(源码中关于adapter存在一个observer,未深究!)adapter数据已改变,刷新view
adapter.notifyDataSetChanged();
// adapter.notifyDataSetInvalidated();// 与上面
// 效果相同,源码中除了注释不同,执行的代码一样,同样未深究
// listView.postInvalidate();刷新无效
break;
}
}
};

private void initListView() {
data = ViewApp.getData();// ViewApp是一个全局的类,程序运行时data数据即加载完毕,这是只是赋值到data成员变量中
adapter = new ListViewAdapter(this, data, R.layout.adapter_item);
SimpleAdapter simpleAdapter = new SimpleAdapter(this, data,
R.layout.adapter_item, new String[] { "text", "buttonText" },
new int[] { R.id.textview1, R.id.button1 });

listView.setAdapter(adapter);
}

class ListViewAdapter extends BaseAdapter {

private List<HashMap<String, String>> data;
private int resource;
private LayoutInflater inflater;

private HashMap<String, String> itemData;

public ListViewAdapter(Context context,
List<HashMap<String, String>> data, int resource) {
// super(context, data, resource, from, to);
this.data = data;
this.resource = resource;
inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
return data.size();
}

@Override
public Object getItem(int position) {
return null;
}

@Override
public long getItemId(int position) {
return 0;
}

// 渲染每一个item的数据,每次上下滑动显示数据时都会调用此方法
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (null == convertView) {
convertView = inflater.inflate(resource, null);

}
// convertView.setTag("abc");
itemData = data.get(position);
TextView textView = (TextView) convertView
.findViewById(R.id.textview1);
textView.setText(itemData.get("text"));
final Button button = (Button) convertView
.findViewById(R.id.button1);
button.setText(itemData.get("buttonText"));
button.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
Toast.makeText(AdapterActivity.this, button.getText(),
Toast.LENGTH_SHORT).show();
}
});
return convertView;
}
}

class ButtonListener implements View.OnClickListener {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button_add:

HashMap<String, String> map = new HashMap<String, String>();
map.put("text", "text200");
map.put("buttonText", "buttonText200");
data.add(map);
Log.i(Constant.TAG, "ADD");

break;
case R.id.button_delete:
Log.i(Constant.TAG, "DELETE");
data.remove(1);
break;
}
adapter.notifyDataSetChanged();// adapter更改后刷新view
}
}

}
复制代码

这篇关于自定义listView及其adapter动态刷新的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1070989

相关文章

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

SpringBoot 自定义消息转换器使用详解

《SpringBoot自定义消息转换器使用详解》本文详细介绍了SpringBoot消息转换器的知识,并通过案例操作演示了如何进行自定义消息转换器的定制开发和使用,感兴趣的朋友一起看看吧... 目录一、前言二、SpringBoot 内容协商介绍2.1 什么是内容协商2.2 内容协商机制深入理解2.2.1 内容

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

.NET利用C#字节流动态操作Excel文件

《.NET利用C#字节流动态操作Excel文件》在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据,本文将演示如何在.NET平台使用C#通过字节流创建,读取,编辑及保... 目录用C#创建并保存Excel工作簿为字节流用C#通过字节流直接读取Excel文件数据用C#通过字节

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s