您的位置:首页 > 其它

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

2014-11-20 16:51 981 查看
在使用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.)

现在看一个例子

[java] view plaincopy

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

[html] view plaincopy

<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

[html] view plaincopy

<?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>

转自:/article/2876080.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐