(转)自定义listView及其adapter动态刷新
本文主要探讨自定义的adapter及其notifyDataSetChanged()方法的使用(无listView的监听部分):
先上图看下效果:(整个操作过程中,当前Activity未被pause或者stop, 豌豆荚截的图真大....无语)
1,初始化状态,共20个dataItem
2, 15秒后向下滑动,增加了一个text100的item:
3,点击添加后,向下滑动,增加了一个text200的item(每点一次添加按钮就会增加一个text200的item):
4,点击删除按钮,上下滑动(每点一次,listView中的item就减少一个):
代码部分未贴完整,有简要注释,未考虑优化
adapter.xml:
<ListViewandroid:id="@+id/listview1" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" android:cacheColorHint="#00000000" /> <LinearLayoutandroid:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Buttonandroid:id="@+id/button_add" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="添加" ></Button> <Buttonandroid: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:
<TextViewandroid:id="@+id/textview1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#FF0000" android:textSize="25dp" /> <Buttonandroid: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; @Overrideprotected 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集合中增加一条数据 @Overridepublic 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() { @Overridepublic 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); } @Overridepublic int getCount() {return data.size(); } @Overridepublic Object getItem(int position) {return null; } @Overridepublic long getItemId(int position) {return 0; } // 渲染每一个item的数据,每次上下滑动显示数据时都会调用此方法 @Overridepublic 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() { @Overridepublic void onClick(View v) { Toast.makeText(AdapterActivity.this, button.getText(), Toast.LENGTH_SHORT).show(); } });return convertView; } } class ButtonListener implements View.OnClickListener { @Overridepublic 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动态刷新相关推荐
- Android 自定义ListView系列之适配器模式(少壮不努力,老大学IT)
最近做个项目,要用到异步加载,动态刷新UI等.看了下2.2系统的图库源码,感觉写的不错.同时又把ListView拿出来研究了下,做个笔记. 先上图: 1. Android中大量用到了适配器模式,比如L ...
- 【Android游戏开发二十三】自定义ListView【通用】适配器并实现监听控件!
本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/374.html L ...
- Android 自定义ListView单击事件失效
因为自带的listView不能满足项目需求,通过实现自己的Adapter去继承ArrayAdapter 来实现自定义ListView的Item项目. 出现点击ListView的每一项都不会执行setO ...
- 自定义ListView【通用】适配器并实现监听控件
ListView:在Android应用开发过程中属于最常用的系统组件之一,当然可能童鞋们问为什么会突然游戏开发中讲这个,呵呵,其实在游戏开发中,也会常常使用到系统组件,比如游戏排行榜,简单的游戏关卡选 ...
- Android listview与adapter用法
2019独角兽企业重金招聘Python工程师标准>>> 一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的选择点击等操作. 第一点很好理解,ListVi ...
- Android 自定义 ListView 显示网络上 JSON 格式歌曲列表
本文内容 环境 项目结构 演示自定义 ListView 显示网络上 JSON 歌曲列表 参考资料 本文最开始看的是一个国人翻译的文章,没有源代码可下载,根据文中提供的代码片段,自己新建的项目(比较可恶 ...
- Android控件——ListView之Adapter提供数据(其二)
2019独角兽企业重金招聘Python工程师标准>>> 上一节中一些列表集合数据到手机屏幕时,通常采用ListView组件+ArrayAdapter. 虽然它能为我们提供展示数据列表 ...
- listview与adapter用法
Android listview与adapter用法 listview与adapter用法 博客分类: android 一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的 ...
- android中上拉下滑布局,3年以上勿进!最简单的Android自定义ListView下拉刷新与上拉加载,代码直接拿去用~...
本文主要针对开发新手,手写实现一个最简单Android自定义listview下拉刷新和上拉加载demo. 不喜可喷,欢迎大佬留言指点. 效果图 一:编写需要在ListView中增加头加载的布局文件,与 ...
- 自定义ListView实现任意View跑马灯效果
自定义ListView实现任意View跑马灯效果 标签(空格分隔): 开源项目 看图 话不多说,先来看下大图效果吧,这里的GIF录制有点渣,不过真实的跑出来的效果还是挺不错的. 前言 最近项目中会加入 ...
最新文章
- MongoDB涉及的业务比较慢--慢查询优化分析案例--以及参数说明
- Html5 音效播放器
- 关于实验中的makefile相关知识
- DNN、CNN、RNN、LSTM的区别
- 2499元起!红米K20 Pro发布 吊打855友商旗舰?
- [转载] python super详解
- XcodeGhost简单查看
- python笔记:python中 | ^表示什么意思
- MarkDown - Latex符号(箭头)的整理
- WSTMart二次开发目录说明
- paper 94:视觉领域博客资源1之中国部分
- 校验组织机构代码 合法性
- 小米历史版本在哪下载
- Flink 的状态保存和恢复
- cdma 复制短息到uim卡的实现
- 人工智能技术概述与入门
- Rails出现ROLLBACK TO SAVEPOINT active_record_1信息的解决
- SPA项目开发之登录
- 中国第一个女程序员——张绮霞
- 各类会议分析(Conference、workshop等,转载)
热门文章
- 操作系统读写者问题实验报告_Linux操作系统存储子系统核心技术之硬盘与RAID
- java案例代码21-电影院购票系统[重要]
- 关于命令行启动MySQL服务的相关问题
- feign三:覆写feign的默认配置及feign的日志
- java----数据结构与算法----JavaAPI:java.util.Collection接口
- 重定向和请求转发后面加“return;”语句
- 团队作业三——项目思考
- [android] 代码注册广播接收者利用广播调用服务的方法
- Pywinauto在Windows Twain Driver自动化测试中的应用研究
- 操作系统学习笔记:文件系统接口