在使用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. java计数器CountDownLatch

    CountDownLatch里面有个属性为state,当为零时触发代码往下执行,代码如下: package threadLock; import java.util.Random; import ja ...

  2. c语言_头文件_stdlib

    简介 stdlib 头文件即standard library标准库头文件 stdlib 头文件里包含了C.C++语言的最常用的系统函数 该文件包含了C语言标准库函数的定义 stdlib.h里面定义了五 ...

  3. IIS6 伪静态

    1. 设置IIS--主目录--脚本映射那一个属性 2.必须还要上传自己的urlrewriter组件,并在config里做相应的设置 二者缺一不可

  4. 理解 php 中& 引用

    php中引用&的真正理解-变量引用.函数引用.对象引用 php的引用(就是在变量或者函数.对象等前面加上&符号) //最重要就是 删除引用的变量 ,只是引用的变量访问不了,但是内容并没 ...

  5. JqGrid动态改变列名

    setLabel colname, data, class, properties jqGrid对象 给指定列设置一个新的显示名称.colname:列名称,也可以是列的位置索引,从0开始:data:列 ...

  6. 经典.net面试题目(3)

    1. asp.net中web应用程序获取数据的流程: A.Web Page B.Fill  C.Sql05  D.Data Sourse  E.DataGrid  F.DataSet  G.Selec ...

  7. angular、bootstrap初稿搭建

    1.bootstrap3.0中,ie8不兼容响应式设计 @media,需要添加如下2个查件 <!-- html5.js for IE less than 9 -->     <!-- ...

  8. 笨方法学python--安装和准备

    1 下载并安装python http://python.org/download 下载python2.7. python2.7并不是python3.5的旧版本. python2现在应用较广,网上资料较 ...

  9. bjective-C 中核心处理字符串的类是 NSString 与 NSMutableString

    Objective-C 中核心处理字符串的类是 NSString 与 NSMutableString ,这两个类最大的区别就是NSString 创建赋值以后该字符串的内容与长度不能在动态的更改,除非重 ...

  10. php 代码编写的格式

    1.代码标记 php程序可以使用<?php ....  ?> 或 <? ..... ?> 来界定php代码,在html页面中嵌入纯变量是,可以使用<?= $variabl ...