在使用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.)

现在看一个例子

package com.jackchan.listviewexception; 
 
import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.Button; 
import android.widget.LinearLayout; 
import android.widget.ListView; 
import android.widget.TextView; 
 
public class MainActivity extends Activity { 
     
    private ListView mListView; 
    private Button btn; 
    private String[] items = new String[]{"Item1","Item2","Item3","Item4","Item5","Item6", 
            "Item7","Item8","Item9","Item10","Item11","Item12","Item13","Item14","Item15","Item16","Item17","Item18" 
            }; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        mListView = (ListView)findViewById(R.id.listview); 
        btn = (Button)findViewById(R.id.btn); 
        mListView.setAdapter(new ListViewAdapter()); 
        btn.setOnClickListener(new OnClickListener() { 
             
            @Override 
            public void onClick(View v) { 
            //  for(int i = 0; i < mListView.getChildCount(); i++) 获取屏幕上可显示的Item数目  
                for(int i = 0; i < mListView.getCount(); i++)//获取ListView的所有Item数目  
                { 
                //    LinearLayout linearlayout = (LinearLayout)mListView.getChildAt(i);  
                    LinearLayout linearlayout = (LinearLayout)mListView.getAdapter().getView(i, null, null); 
                    TextView textview = (TextView)linearlayout.getChildAt(0); 
                    Log.d("text", textview.getText().toString()); 
                } 
            } 
        }); 
    } 
 
    public class ViewHolder{ 
        TextView textview; 
    } 
     
    private class ListViewAdapter extends BaseAdapter{ 
         
         
        @Override 
        public int getCount() { 
            // TODO Auto-generated method stub  
            return items.length; 
        } 
 
        @Override 
        public Object getItem(int position) { 
            // TODO Auto-generated method stub  
            return null; 
        } 
 
        @Override 
        public long getItemId(int position) { 
            // TODO Auto-generated method stub  
            return 0; 
        } 
 
        @Override 
        public View getView(int position, View convertView, ViewGroup parent) { 
            ViewHolder viewHolder = new ViewHolder(); 
            if(convertView == null){ 
                convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.listviewitem, null); 
                viewHolder.textview = (TextView)convertView.findViewById(R.id.textview); 
                convertView.setTag(viewHolder); 
            } 
            else{ 
                viewHolder = (ViewHolder)convertView.getTag(); 
            } 
            viewHolder.textview.setText(items[position].toString()); 
            return convertView; 
        } 
         
    } 

package com.jackchan.listviewexception;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {
 
 private ListView mListView;
 private Button btn;
 private String[] items = new String[]{"Item1","Item2","Item3","Item4","Item5","Item6",
   "Item7","Item8","Item9","Item10","Item11","Item12","Item13","Item14","Item15","Item16","Item17","Item18"
   };
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mListView = (ListView)findViewById(R.id.listview);
        btn = (Button)findViewById(R.id.btn);
        mListView.setAdapter(new ListViewAdapter());
        btn.setOnClickListener(new OnClickListener() {
   
   @Override
   public void onClick(View v) {
   // for(int i = 0; i < mListView.getChildCount(); i++) 获取屏幕上可显示的Item数目
    for(int i = 0; i < mListView.getCount(); i++)//获取ListView的所有Item数目
          {
    //    LinearLayout linearlayout = (LinearLayout)mListView.getChildAt(i);
           LinearLayout linearlayout = (LinearLayout)mListView.getAdapter().getView(i, null, null);
           TextView textview = (TextView)linearlayout.getChildAt(0);
           Log.d("text", textview.getText().toString());
          }
   }
  });
    }

public class ViewHolder{
     TextView textview;
    }
   
    private class ListViewAdapter extends BaseAdapter{
     
     
  @Override
  public int getCount() {
   // TODO Auto-generated method stub
   return items.length;
  }

@Override
  public Object getItem(int position) {
   // TODO Auto-generated method stub
   return null;
  }

@Override
  public long getItemId(int position) {
   // TODO Auto-generated method stub
   return 0;
  }

@Override
  public View getView(int position, View convertView, ViewGroup parent) {
   ViewHolder viewHolder = new ViewHolder();
   if(convertView == null){
    convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.listviewitem, null);
    viewHolder.textview = (TextView)convertView.findViewById(R.id.textview);
    convertView.setTag(viewHolder);
   }
   else{
    viewHolder = (ViewHolder)convertView.getTag();
   }
   viewHolder.textview.setText(items[position].toString());
   return convertView;
  }
     
    }
}

重点看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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android
    xmlns:tools="http://schemas.android.com/tools
    android:layout_width="match_parent" 
    android:layout_height="match_parent"  
    android:orientation="vertical"> 
    <Button 
        android:id="@+id/btn" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="changetext" 
        /> 
    <ListView  
        android:id="@+id/listview" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        /> 
</LinearLayout> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <Button
        android:id="@+id/btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="changetext"
        />
 <ListView
     android:id="@+id/listview"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     />
</LinearLayout>

listviewitem.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 
    <TextView  
        android:id="@+id/textview" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:textSize="20sp" 
        /> 
 
</LinearLayout>

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

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

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

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

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

  3. RN中listView的每个item等高

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

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

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

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

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

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

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

  7. 利用ListView批量删除item

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

  8. Android处理ListView中的Item中的Button按钮不能点击的问题

    问题描述:ListView列表中的Button按钮按钮不能点击 解决办法:在ListView中的Item项的布局文件中加上:android:descendantFocusability="b ...

  9. ListView点击Item展开隐藏项(单项展开、多项展开、复杂布局时的展开处理)

    手机屏幕毕竟有限,当我们要显示较多数据时便不得不舍去一些次要信息.将主要信息优先显示,也使显示效果更加简洁美观.遇到类似的需求,我们使用最多的就是 ListView ,而假设每次点击一个 Item 都 ...

随机推荐

  1. Django:之不得不说的web框架们

    python的web框架 Bottle Bpttle是一个快速.简洁.轻量级的基于WSIG的微型web框架,此框架只有一个.py文件,除了python的标准库外,其不依赖任何其它模块. pip ins ...

  2. PHP数据库扩展mysqli的函数试题

    1.mysqli链接数据库的方式是什么? 2.mysqli获取链接错误号的属性是什么? 3.mysqli获取链接错误信息的属性是什么? 4.mysqli执行sql语句的函数是什么? 5.mysqli获 ...

  3. Qt Creator下载和安装(详细教程)

    简介 Qt是跨平台的图形开发库,目前由Digia全资子公司 Qt Company 独立运营,官方网址: http://www.qt.io/ 也可以访问Qt项目域名:http://qt-project. ...

  4. Windows GTK+ 环境搭建(详解)

    来源:http://blog.sina.com.cn/s/blog_a6fb6cc901017ygy.html Windows GTK+ 环境搭建 最近要做界面的一些东西,但是对微软提供的类库MFC不 ...

  5. Oracle10 多行和并

    SELECT fspc, wmsys.wm_concat (jsrzmc) as jsr FROM dxjsrxx GROUP BY fspc select fspc, LISTAGG(jsrzmc, ...

  6. Tomcat配置远程调试端口

    Tomcat配置远程调试端口 1.Linxu系统: apach/bin/startup.sh开始处中增加如下内容: declare -x CATALINA_OPTS="-server -Xd ...

  7. C++左值

    C++左值 左值参数是可被引用的数据对象.比如,变量,数组元素,结构成员,引用和解引用指针 非左值包含字面常量(用引号括起的字符串除外,它们是由地址表示的)和包含多项的表达式 在C语言里面左值最初指的 ...

  8. ligerUI调用$.ligerDialog.open弹出窗口,关闭后无法获取焦点问题

    1:调用父窗口某一个文件框,获取焦点,   parent.window.document.getElementByIdx_x("roleName").focus(); 2:关闭父窗 ...

  9. Hibernate 系列教程1-枚举单例类

    你还在为不知道怎样正确使用Hibernate而纠结吗 你还在为不知道怎样配置映射文件而郁闷吗 枚举单例(Enum Singleton) 是实现单例模式的一种方式而已,不过写法简单,创建枚举默认也是线程 ...

  10. 128M小内存VPS优化与typecho环境搭建

    在使用Haphost提供的128M内存的VPS建站时,debian7+wordpress+nginx+mysql跑起来相当吃力.然后使用Debian7+typecho+lighttpd+sqlite的 ...