在使用ListView过程中我们有时候需要遍历取得每个Item项中的一些数据(比如每个Item里面有TextView,需要获取它的文本等等),但是我们在遍历过程中经常会遇到NullPointerException的异常,其实这不过是listview中getCount()和getChildCount()这个两个函数的一些使用上的不同导致的。

getChildCount():这个函数是获取ListView在当前界面上能够被看到的(不是所有)Item的数目,因为ListView中当Item很多的时候,有些无法显示在屏幕上。

getCount():这个函数就是可以获取ListView中可见的和不可见的所有Item项数目(附上该函数返回值的官方英文解释)

The number of items owned by the Adapter associated with this AdapterView. (This is the number of data items, which may be larger than the number of visible views.)

现在看一个例子

  1. package com.jackchan.listviewexception;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.util.Log;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.view.ViewGroup;
  9. import android.widget.BaseAdapter;
  10. import android.widget.Button;
  11. import android.widget.LinearLayout;
  12. import android.widget.ListView;
  13. import android.widget.TextView;
  14. public class MainActivity extends Activity {
  15. private ListView mListView;
  16. private Button btn;
  17. private String[] items = new String[]{"Item1","Item2","Item3","Item4","Item5","Item6",
  18. "Item7","Item8","Item9","Item10","Item11","Item12","Item13","Item14","Item15","Item16","Item17","Item18"
  19. };
  20. @Override
  21. public void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.main);
  24. mListView = (ListView)findViewById(R.id.listview);
  25. btn = (Button)findViewById(R.id.btn);
  26. mListView.setAdapter(new ListViewAdapter());
  27. btn.setOnClickListener(new OnClickListener() {
  28. @Override
  29. public void onClick(View v) {
  30. //  for(int i = 0; i < mListView.getChildCount(); i++) 获取屏幕上可显示的Item数目
  31. for(int i = 0; i < mListView.getCount(); i++)//获取ListView的所有Item数目
  32. {
  33. //    LinearLayout linearlayout = (LinearLayout)mListView.getChildAt(i);
  34. LinearLayout linearlayout = (LinearLayout)mListView.getAdapter().getView(i, null, null);
  35. TextView textview = (TextView)linearlayout.getChildAt(0);
  36. Log.d("text", textview.getText().toString());
  37. }
  38. }
  39. });
  40. }
  41. public class ViewHolder{
  42. TextView textview;
  43. }
  44. private class ListViewAdapter extends BaseAdapter{
  45. @Override
  46. public int getCount() {
  47. // TODO Auto-generated method stub
  48. return items.length;
  49. }
  50. @Override
  51. public Object getItem(int position) {
  52. // TODO Auto-generated method stub
  53. return null;
  54. }
  55. @Override
  56. public long getItemId(int position) {
  57. // TODO Auto-generated method stub
  58. return 0;
  59. }
  60. @Override
  61. public View getView(int position, View convertView, ViewGroup parent) {
  62. ViewHolder viewHolder = new ViewHolder();
  63. if(convertView == null){
  64. convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.listviewitem, null);
  65. viewHolder.textview = (TextView)convertView.findViewById(R.id.textview);
  66. convertView.setTag(viewHolder);
  67. }
  68. else{
  69. viewHolder = (ViewHolder)convertView.getTag();
  70. }
  71. viewHolder.textview.setText(items[position].toString());
  72. return convertView;
  73. }
  74. }
  75. }

重点看Button的OnClickListener事件,当我们使用for(int i = 0; i < mListView.getChildCount(); i++)

就只能对当前屏幕可见的Item做遍历,不能到达我们要对所有Item遍历的目的。

在for循环里还有一个被我注释起来的方法getChildAt();

getChildAt():这个函数是用来获得ListView的Item,它能取到的Item的最大值为当前可见的Item数目,比如,当前屏幕只能看到ListView的6个Item,但你调用了getChildAt(6),相当于要获得ListView第七个可见的Item,这个时候就会报出NullPointerException ,我在这里提供的解决方法就是调用adapter的getView方法,这个方法可以获取ListView的所有Item,mListView.getAdapter().getView(i, null, null);

ListView在android开发中是经常用到的组件,除非只做展示功能,否则一般建议自定义Adapter,这样可以省去很多麻烦。最后附上两个.xml的代码

main.xml

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">
  6. <Button
  7. android:id="@+id/btn"
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:text="changetext"
  11. />
  12. <ListView
  13. android:id="@+id/listview"
  14. android:layout_width="fill_parent"
  15. android:layout_height="wrap_content"
  16. />
  17. </LinearLayout>

listviewitem.xml

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent"
    5. android:orientation="horizontal" >
    6. <TextView
    7. android:id="@+id/textview"
    8. android:layout_width="wrap_content"
    9. android:layout_height="wrap_content"
    10. android:textSize="20sp"
    11. />
    12. </LinearLayout>

转自:http://blog.csdn.net/chenzujie/article/details/8680756

ListView遍历每个Item出现NullPointerException的异常(转)的更多相关文章

  1. ListView遍历每个Item出现NullPointerException的异常

    在使用ListView过程中我们有时候需要遍历取得每个Item项中的一些数据(比如每个Item里面有TextView,需要获取它的文本等等),但是我们在遍历过程中经常会遇到NullPointerExc ...

  2. ListView遍历每个Item出现NullPointerException的异常处理(转)

    在使用ListView过程中我们有时候需要遍历取得每个Item项中的一些数据(比如每个Item里面有TextView,需要获取它的文本等等),但是我们在遍历过程中经常会遇到NullPointerExc ...

  3. Java动态 遍历List 时删除List特征元素 异常问题 及解决方案总结

    首先.这是一个极其简单的问题,大牛可忽略.新手可能会遇到,Java中遍历某个List 时删除该List元素 会抛出异常. 这一个简单的问题再高手严重不值一提,但新手可能会比較困惑,用哪种方式能够安全有 ...

  4. RN中listView的每个item等高

    今天写ListView的每个Item的布局的时候发现,当文字太长时被截掉了不能完全显示,检查了很久发现没有设置固定高度都是可伸缩的为什么没有伸缩呢.看了很久才发现每个item是等高的,于是仔细检查才看 ...

  5. Android中Listview点击item不变颜色以及设置listselector 无效

    Android中Listview点击item不变颜色以及设置listselector 无效 这是同一个问题,Listview中点击item是会变颜色的,因为listview设置了默认的listsele ...

  6. listview指定某item的点击效果

    需求:listview的某些item能够点击,需要点击效果,有些item不能点击,需要屏蔽点击效果. 实现: 1.layout: <ListView android:id="@+id/ ...

  7. Android ListView实现不同item的方法和原理分析

    ListView实现不同item的方法和原理分析 一问题抛出Listview是android里面的重要组件,用来显示一个竖向列表,这个没有什么问题:但是有个时候列表里面的item不是一样的,如下图,列 ...

  8. 在Servlet使用getServletContext()获取ServletContext对象出现java.lang.NullPointerException(空指针)异常的解决办法

    今天遇到了一个在servlet的service方法中获取ServletContext对象出现java.lang.NullPointerException(空指针)异常,代码如下: 1 //获取Serv ...

  9. 利用ListView批量删除item

    利用CheckBox选中一个或多个item,最后批量删除它们. 程序运行效果图如下: package com.test.adapter; import java.util.ArrayList; imp ...

随机推荐

  1. close与shutdown函数

    linux网络编程之socket(十):shutdown 与 close 函数的区别  http://blog.csdn.net/yijiu0711/article/details/17349169 ...

  2. 79 两个整数集合A和B,求其交集

    [本文链接] http://www.cnblogs.com/hellogiser/p/ab-intersect.html [题目] 两个整数集合A和B,求其交集. [分析]   1. 读取整数集合A中 ...

  3. mysql性能优化学习笔记-存储引擎

    mysql体系架构 客户端(java.php.python等) mysql服务层(连接管理器.查询解析器.查询优化器.查询缓存) mysql存储引擎(innodb.myisam等) 存储引擎针对表而言 ...

  4. cf592d

    题意:给出一个无根树,点数为10^5,所有边的长度为1.给定其中有一些点是受到攻击的. 现在要求一个人选定一个点作为起点,走遍所有的受攻击点(不用再回到起点). 需要的最短距离是多少,选定的起点是哪个 ...

  5. 解读Unity中的CG编写Shader系列八(镜面反射)

    转自http://www.itnose.net/detail/6117378.html 讨论完漫反射之后,接下来肯定就是镜面反射了 在开始镜面反射shader的coding之前,要扩充一下前面提到的知 ...

  6. Tesseract-OCR text2image.exe [ x86 支持 XP ]

    Tesseract-OCR 工具中的 text2image.exe ,下载其他人编译的在 win 系统都无法正常运行. 折腾了好久终于编译出能正常运行的. --font="font name ...

  7. Odoo误删除服务产品造成的错误解决办法

    在Odoo8.0中删除了产品中的服务,会造成工时单模块的安装失败,信息如下所示: ParseError: "null value in column "name" vio ...

  8. centos 6.5 配置LDAP服务器+客户端!

    各种度娘!各种歌哥!网上教程参差不齐,历时1天,终于完成,不敢独享,遂,总结分享之,有问题可以留言,知无不言...开始吧 Note: 本次配置的服务器环境是<redhat enterprise ...

  9. php简易灌水

    <?php $data = array ('content' => '白菜大侠','itemid'=>58); $data = http_build_query($data); $o ...

  10. css3属性flex弹性布局设置三列(四列)分布样式

    参考:阮一峰的网络日志 <!doctype html> <html lang="en"> <head> <meta charset=&qu ...