先来看下项目主要内容:

ListView中填充数据:

  1. 重现添加数据后置顶,具体阐明了决解方案,如下:

  2. 刷新适配器后没有响应的错误现象,具体阐明了决解方案,如下:

  3. 正确示范一:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    /**
    * 正确示范一(正确运用,修改原始对象<Activity里面>对应引用<Adapter里面>也改变)
    *
    * @author johnny
    *
    */
    publicclassThreeListViewActivity extendsActivity {
    privateListView mContentLv;
    privateOneAdapter adapter;
    privateArrayList<HashMap<String, String>> arrayList=newArrayList<HashMap<String,String>>();
    @Override
    protectedvoidonCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_listview);
    mContentLv = (ListView) findViewById(R.id.lv_content);
    adapter=newOneAdapter(this,arrayList);
    mContentLv.setAdapter(adapter);
    initData();
    ToastUtils.show(getApplicationContext(), "6秒后延迟添加,刷新adapter");
    //开启异步线程
    setData();
    }
    privatevoidsetData() {
    newThread(newRunnable() {
    @Override
    publicvoidrun() {
    // TODO Auto-generated method stub
    try{
    //做一些耗时的操作后添加数据,之后刷新adapter
    Thread.sleep(6000);
    } catch(InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    //可能这个时候才重网络上获取到了新数据,,现在开始添加数据
    HashMap<String, String> hashMap;
    for(inti = 0; i < 5; i++) {
    hashMap = newHashMap<String, String>();
    if(i % 4== 0) {
    hashMap.put("name", "大海");
    hashMap.put("address", "上海");
    } elseif(i % 4== 1) {
    hashMap.put("name", "老马");
    hashMap.put("address", "深圳");
    } elseif(i % 4== 2) {
    hashMap.put("name", "小三");
    hashMap.put("address", "东莞");
    } elseif(i % 4== 3) {
    hashMap.put("name", "老哥");
    hashMap.put("address", "北京");
    }
    arrayList.add(hashMap);
    }
    handler.sendEmptyMessage(1);
    }
    }).start();
    }
    Handler handler = newHandler(){
    publicvoidhandleMessage(android.os.Message msg) {
    adapter.notifyDataSetChanged();//没有重现设置adapter,只做了刷新数据,listview不会到顶。
    ToastUtils.show(getApplicationContext(), "adapter共有"+adapter.getAllList().size()+"个数据,activity共有"+arrayList.size()+"个数据,刷新结束!");
    };
    };
    privatevoidinitData() {
    HashMap<String, String> hashMap;
    for(inti = 0; i < 15; i++) {
    hashMap = newHashMap<String, String>();
    if(i % 4== 0) {
    hashMap.put("name", "小明");
    hashMap.put("address", "上海");
    } elseif(i % 4== 1) {
    hashMap.put("name", "老马");
    hashMap.put("address", "深圳");
    } elseif(i % 4== 2) {
    hashMap.put("name", "小三");
    hashMap.put("address", "东莞");
    } elseif(i % 4== 3) {
    hashMap.put("name", "老哥");
    hashMap.put("address", "北京");
    }
    arrayList.add(hashMap);
    }
    }
    }

    正确示范二:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    /**
    * 正确示范二(正确运用,Activity里面对象不用作Adapter原始对象,只做数据的备份。
    * 这也是本人比较喜欢的写法,原因:很多时候我们会不经意间改变Activity里面的数据源后导致ListView的改变,
    * 导致出错后排除错误难解<正确示范一,当然也有好处,比如:改变Activity数据后,不需要再做多余的Adapter数据的更改,方便>)
    *
    * @注意 这里只是数据添加方案本人赞成写法,具体完整结合adapter请移步个人推荐一或二<有错误示范,才能慢慢完善改变,错误何尝不是一种成长>
    * @author johnny
    *
    */
    publicclassFourListViewActivity extendsActivity {
    privateListView mContentLv;
    privateOneAdapter adapter;
    @Override
    protectedvoidonCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_listview);
    mContentLv = (ListView) findViewById(R.id.lv_content);
    adapter=newOneAdapter(this);
    mContentLv.setAdapter(adapter);
    initData();
    ToastUtils.show(getApplicationContext(), "6秒后延迟添加,刷新adapter");
    //开启异步线程
    setData();
    }
    privatevoidsetData() {
    newThread(newRunnable() {
    @Override
    publicvoidrun() {
    // TODO Auto-generated method stub
    try{
    //做一些耗时的操作后添加数据,之后刷新adapter
    Thread.sleep(6000);
    } catch(InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    ArrayList<HashMap<String, String>> arrayList=newArrayList<HashMap<String,String>>();
    //可能这个时候才重网络上获取到了新数据,,现在开始添加数据
    HashMap<String, String> hashMap;
    for(inti = 0; i < 5; i++) {
    hashMap = newHashMap<String, String>();
    if(i % 4== 0) {
    hashMap.put("name", "大海");
    hashMap.put("address", "上海");
    } elseif(i % 4== 1) {
    hashMap.put("name", "老马");
    hashMap.put("address", "深圳");
    } elseif(i % 4== 2) {
    hashMap.put("name", "小三");
    hashMap.put("address", "东莞");
    } elseif(i % 4== 3) {
    hashMap.put("name", "老哥");
    hashMap.put("address", "北京");
    }
    //这里添加的只是在临时数据存储的对象,adapter里面不属于同一个对象
    arrayList.add(hashMap);
    }
    //和正确范例一区别在于此,每次都需要把数据copy到adapter里面
    adapter.setAddList(arrayList);
    handler.sendEmptyMessage(1);
    }
    }).start();
    }
    Handler handler = newHandler(){
    publicvoidhandleMessage(android.os.Message msg) {
    adapter.notifyDataSetChanged();//没有重现设置adapter,只做了刷新数据,ListView不会到顶。
    ToastUtils.show(getApplicationContext(), "adapter共有"+adapter.getAllList().size()+"个数据。");
    };
    };
    privatevoidinitData() {
    ArrayList<HashMap<String, String>> arrayList=newArrayList<HashMap<String,String>>();
    HashMap<String, String> hashMap;
    for(inti = 0; i < 15; i++) {
    hashMap = newHashMap<String, String>();
    if(i % 4== 0) {
    hashMap.put("name", "小明");
    hashMap.put("address", "上海");
    } elseif(i % 4== 1) {
    hashMap.put("name", "老马");
    hashMap.put("address", "深圳");
    } elseif(i % 4== 2) {
    hashMap.put("name", "小三");
    hashMap.put("address", "东莞");
    } elseif(i % 4== 3) {
    hashMap.put("name", "老哥");
    hashMap.put("address", "北京");
    }
    arrayList.add(hashMap);
    }
    adapter.setAddList(arrayList);
    }
    }

    ListView 适配器推荐写法:


    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      @Override
      publicView getView(intposition, View convertView, ViewGroup parent) {
      // TODO Auto-generated method stub
      View v = convertView;
      //判断是否为null,这是每个要做复用的都要写的
      if(v == null) {
      v = inflater.inflate(R.layout.lv_item, null);
      }
      //相比之下
      //写法太集中,没有细化
      /*if (null == convertView) {
      holder = new ViewHolder();
      convertView = inflater.inflate(R.layout.lv_item, null);
      holder.mNameTv = (TextView) convertView.findViewById(R.id.tv_name);
      holder.mAddressTv = (TextView) convertView.findViewById(R.id.tv_address);
      convertView.setTag(holder);
      } else {
      holder = (ViewHolder) convertView.getTag();
      }*/
      //简洁,把初始化控件放到了ViewHolder里面,是的getView方法更清晰简洁,只需要做数据的赋值和复杂的逻辑,没有混为一滩
      ViewHolder holder = (ViewHolder) v.getTag();    
      if(holder == null) {
      holder = newViewHolder(v);
      v.setTag(holder);
      }
      HashMap<String, String> hashMap = getItem(position);
      holder.mNameTv.setText(hashMap.get("name"));
      holder.mAddressTv.setText(hashMap.get("address"));
      returnv;
      }

    方法二:

    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      @Override
      publicView getView(intposition, View convertView, ViewGroup parent) {
      // TODO Auto-generated method stub
      View v = convertView;
      //判断是否为null,这是每个要做复用的都要写的
      if(v == null) {
      v = inflater.inflate(R.layout.lv_item, null);
      }
      //简洁,方便,快速
      TextView mNameTv=ViewHolder.get(v, R.id.tv_name);  
      TextView mAddressTv=ViewHolder.get(v, R.id.tv_address);  
      HashMap<String, String> hashMap = getItem(position);
      mNameTv.setText(hashMap.get("name"));
      mAddressTv.setText(hashMap.get("address"));
      returnv;
      }

ListView中疑难杂症:

只做截图具体下载代码查看:不需要豆子


e

另链接单选删除帖子效果如下:


地址:点击进入


×××:

ListView中常用知识总结

转载于:https://blog.51cto.com/wangyubin/1361691

android ListView常用知识总结相关推荐

  1. Android ListView常用用法

    ListView是比较常用的控件,但一直都觉得创建ListView步骤有点繁琐,故在此总结一下,方便查阅. 程序效果是实现一个ListView,ListView里面有标题,内容和图片,并加入点击和长按 ...

  2. Android ListView常用用法(结合长按、数据库等)

    http://www.iteye.com/topic/540423 ListView是比较常用的控件,但一直都觉得创建ListView步骤有点繁琐,故在此总结一下,方便查阅. 程序效果是实现一个Lis ...

  3. Android ListView常用用法(二)

    来自:51CTO论坛 原帖:http://mobile.51cto.com/android-254823.htm Android开发:实现带图片和checkbox的listview 项目要用到一个li ...

  4. Android群英传知识点回顾——第四章:ListView常用优化技巧

    Android群英传知识点回顾--第四章:ListView常用优化技巧 知识点目录 4.1 ListView常用优化技巧 4.1.1 使用ViewHolder模式提高效率 4.1.2 设置项目间分割线 ...

  5. Android中常用的设计模式

    一:参考文档 先介绍参考文档(或许我们更容易明白):另记录本人可参考 QQ15 MobileSafe 两个Demo 有哪些在实际 Android 项目中用到的设计模式? Android开发中常见的设计 ...

  6. android开发常用组件和第三方库(二)

    TimLiu-Android 自己总结的Android开源项目及库. github排名 https://github.com/trending, github搜索:https://github.com ...

  7. android培训总结范文,android培训基础知识总结

    android培训基础知识总结,有需要的朋友可以参考下. android培训之1. Android的四大组件是哪些,它们的作用? Activity:Activity是Android程序与用户交互的窗口 ...

  8. Android ListView (多个adapter 说明)

    最近维护项目,项目里面使用的都是ListView 这里也对ListView 回顾一下 以下 demo 地址 ListView 在Android 里面用来实现列表的, 在xml 中创建ListView ...

  9. Android ListView 自定义背景后 滚动时的背景变黑问题

    ListView是常用的显示控件,默认背景是和系统窗口一样的透明色,如果给ListView加上背景图片,或者背景颜色时,滚动时listView会黑掉,原因是,滚动时,列表里面的view重绘时,用的依旧 ...

最新文章

  1. 移动端与PHP服务端接口通信流程设计(基础版)
  2. linux修改ssh端口和禁止root远程登陆设置
  3. [总结]Asp.net中的页面乱码的问题
  4. Jmeter_初步认识随笔
  5. Django2 Web 实战03-文件上传
  6. 【BZOJ3524】Couriers,第一次的主席树
  7. 组合日期_为什么我的透视表没法按日期组合?
  8. Tpcc-mysql 结果解读
  9. php 抽象类 静态 单体设计模式
  10. 只要听说过电脑的人都能看懂的网上pdf全书获取项目
  11. 常用Quartz cron表达式例子
  12. php后台管理修改密码,重置网站后台管理员密码
  13. SX1278 Lora网关
  14. 通过getPixel();和通过bmp.getPixels();方法遍历整张图片的效率比较。
  15. python编辑svg文件_使用Python创建SVG
  16. 小米将在武汉建1万人研发中心
  17. 软件·质量·管理(2)任务排期
  18. android指定sim卡拨号,使用双SIM卡设备中的指定SIM拨打电话
  19. 利用wxpython库来制作真心话大冒险小程序
  20. How OS technology is being deployed in science?

热门文章

  1. win2003无法进入桌面_电脑桌面怎么建立便签,可以在电脑桌面显示的便签
  2. win7下hosts文件位置
  3. cp和scp复制命令
  4. 安卓学习笔记07:事件处理、窗口跳转与传递数据
  5. 配置Apache服务器的虚拟主机
  6. C ++基础 | sizeof函数(endl 和 \ n),定义常量(Define Constants),枚举常量(Enumerated Constants)_2
  7. 网络计算机热词,2017年的首个网络热词就这样被刷屏了!
  8. bzoj4417 [Shoi2013]超级跳马 矩乘
  9. 2017.9.30 物流运输 思考记录
  10. Intel 64/x86_64/IA-32/x86处理器 - 通用指令(7) - 标志寄存器/标志控制指令 段寄存器指令