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

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

时间: 2024-08-06 07:50:17

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

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

在使用ListView过程中我们有时候需要遍历取得每个Item项中的一些数据(比如每个Item里面有TextView,需要获取它的文本等等),但是我们在遍历过程中经常会遇到NullPointerException的异常,其实这不过是listview中getCount()和getChildCount()这个两个函数的一些使用上的不同导致的. getChildCount():这个函数是获取ListView在当前界面上能够被看到的(不是所有)Item的数目,因为ListView中当Item很多的时候,

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

在使用ListView过程中我们有时候需要遍历取得每个Item项中的一些数据(比如每个Item里面有TextView,需要获取它的文本等等),但是我们在遍历过程中经常会遇到NullPointerException的异常,其实这不过是listview中getCount()和getChildCount()这个两个函数的一些使用上的不同导致的. getChildCount():这个函数是获取ListView在当前界面上能够被看到的(不是所有)Item的数目,因为ListView中当Item很多的时候,

自定义ListView里面的Item的内容

我们不可能满足只是往每个item里面填字就足够,像QQ的好友列表就是一个ListView,每个Item里面有头像.名字啊.签名什么的,内容丰富.那我们要怎么定义一个内容丰富的item呢? 要用到Adapter啦!构造每一个ListView都要有一个Adapter,只要这个Adapter弄好了,每个Item也就弄好啦! 让我们来看看构造一个ListView的普遍方法! Adapter adpter = new MyAdapter(content,LayoutID,T[]); listView.se

RN中listView的每个item等高

今天写ListView的每个Item的布局的时候发现,当文字太长时被截掉了不能完全显示,检查了很久发现没有设置固定高度都是可伸缩的为什么没有伸缩呢.看了很久才发现每个item是等高的,于是仔细检查才看到自己给每个item的最外层的那个View组件加了flex:1. 所以对于整个ListView来说每个item是等比的1,造成高度一样,内容被截掉,由于马虎导致特此记录一下.

文件重命名之动态修改ListView里指定Item中的组件属性

在Android实际开发过程中经常会遇到,修改ListView中某一项的值.如何达到这一目的呢? 方法主要有两种: 第一种方式:当ListView中某一项的值发生变化之后,重新加载数据已达到更新ListView的目的. 虽然第一种方式能够解决问题,但不值得推荐.因为这样会带来不必要的资源消耗.在移动终端这种硬件资源和计算能力都有限的情况下,显然有点得不偿失了,况且用户的体验也不好. 第二种方式:第二种方式可以说是第一种方式的改进.ListView中某一项的值发生改变,实际上是ListView的数

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

ListView实现不同item的方法和原理分析 一问题抛出Listview是android里面的重要组件,用来显示一个竖向列表,这个没有什么问题:但是有个时候列表里面的item不是一样的,如下图,列表里面应该有3种类型的item  1. 头像在左边的气泡Item ,比如”今天下午我就不出来了,...”2. 头像在右边的气泡Item,比如”那就等着我发你好吧”3. 单张图片显示圆角图片item几种Item的风格是完全不同的,那么怎么实现呢? 二实现方法实现的方法我这里可以列举出两种1. 每个It

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

这是同一个问题,Listview中点击item是会变颜色的,因为listview设置了默认的listselector,有一个默认的颜色,同理如果点击没颜色变化我们怎么设置listselector也不会变颜色的. 但是在我们的开发过程中,我们可能会碰到这样的问题listview点击不变颜色,总结了一下大概有这几种原因: 1.item的layout设置background颜色值,去掉背景颜色即可 2.listview中listselector属性的效果被覆盖了,比如列表的Item为一个占满单元格的I

listview指定某item的点击效果

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

Android动态加载ListView中的Item

我这周上网看到动态增加listview的每一项item的布局,今天抽空自己写了一个,方便自己日后使用,这个效果还是很不错的,用到了Adapter的notifyDataSetChanged()方法,当点击每一个Item的时候,就通知adapter更新getView,系统得到通知就相应的加载一遍布局,就达到了动态加载item布局的效果.希望给大家带来点启迪,有问题或想要代码的可以留言,欢迎大家留言谈论listview的一些知识,以求共同进步,转载请标明出处: http://blog.csdn.net