本文主要探讨自定义的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动态刷新相关推荐

  1. Android 自定义ListView系列之适配器模式(少壮不努力,老大学IT)

    最近做个项目,要用到异步加载,动态刷新UI等.看了下2.2系统的图库源码,感觉写的不错.同时又把ListView拿出来研究了下,做个笔记. 先上图: 1. Android中大量用到了适配器模式,比如L ...

  2. 【Android游戏开发二十三】自定义ListView【通用】适配器并实现监听控件!

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/374.html L ...

  3. Android 自定义ListView单击事件失效

    因为自带的listView不能满足项目需求,通过实现自己的Adapter去继承ArrayAdapter 来实现自定义ListView的Item项目. 出现点击ListView的每一项都不会执行setO ...

  4. 自定义ListView【通用】适配器并实现监听控件

    ListView:在Android应用开发过程中属于最常用的系统组件之一,当然可能童鞋们问为什么会突然游戏开发中讲这个,呵呵,其实在游戏开发中,也会常常使用到系统组件,比如游戏排行榜,简单的游戏关卡选 ...

  5. Android listview与adapter用法

    2019独角兽企业重金招聘Python工程师标准>>> 一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的选择点击等操作. 第一点很好理解,ListVi ...

  6. Android 自定义 ListView 显示网络上 JSON 格式歌曲列表

    本文内容 环境 项目结构 演示自定义 ListView 显示网络上 JSON 歌曲列表 参考资料 本文最开始看的是一个国人翻译的文章,没有源代码可下载,根据文中提供的代码片段,自己新建的项目(比较可恶 ...

  7. Android控件——ListView之Adapter提供数据(其二)

    2019独角兽企业重金招聘Python工程师标准>>> 上一节中一些列表集合数据到手机屏幕时,通常采用ListView组件+ArrayAdapter. 虽然它能为我们提供展示数据列表 ...

  8. listview与adapter用法

    Android listview与adapter用法 listview与adapter用法 博客分类: android 一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的 ...

  9. android中上拉下滑布局,3年以上勿进!最简单的Android自定义ListView下拉刷新与上拉加载,代码直接拿去用~...

    本文主要针对开发新手,手写实现一个最简单Android自定义listview下拉刷新和上拉加载demo. 不喜可喷,欢迎大佬留言指点. 效果图 一:编写需要在ListView中增加头加载的布局文件,与 ...

  10. 自定义ListView实现任意View跑马灯效果

    自定义ListView实现任意View跑马灯效果 标签(空格分隔): 开源项目 看图 话不多说,先来看下大图效果吧,这里的GIF录制有点渣,不过真实的跑出来的效果还是挺不错的. 前言 最近项目中会加入 ...

最新文章

  1. MongoDB涉及的业务比较慢--慢查询优化分析案例--以及参数说明
  2. Html5 音效播放器
  3. 关于实验中的makefile相关知识
  4. DNN、CNN、RNN、LSTM的区别
  5. 2499元起!红米K20 Pro发布 吊打855友商旗舰?
  6. [转载] python super详解
  7. XcodeGhost简单查看
  8. python笔记:python中 | ^表示什么意思
  9. MarkDown - Latex符号(箭头)的整理
  10. WSTMart二次开发目录说明
  11. paper 94:视觉领域博客资源1之中国部分
  12. 校验组织机构代码 合法性
  13. 小米历史版本在哪下载
  14. Flink 的状态保存和恢复
  15. cdma 复制短息到uim卡的实现
  16. 人工智能技术概述与入门
  17. Rails出现ROLLBACK TO SAVEPOINT active_record_1信息的解决
  18. SPA项目开发之登录
  19. 中国第一个女程序员——张绮霞
  20. 各类会议分析(Conference、workshop等,转载)

热门文章

  1. 操作系统读写者问题实验报告_Linux操作系统存储子系统核心技术之硬盘与RAID
  2. java案例代码21-电影院购票系统[重要]
  3. 关于命令行启动MySQL服务的相关问题
  4. feign三:覆写feign的默认配置及feign的日志
  5. java----数据结构与算法----JavaAPI:java.util.Collection接口
  6. 重定向和请求转发后面加“return;”语句
  7. 团队作业三——项目思考
  8. [android] 代码注册广播接收者利用广播调用服务的方法
  9. Pywinauto在Windows Twain Driver自动化测试中的应用研究
  10. 操作系统学习笔记:文件系统接口