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
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
相关文章推荐
- ListView遍历每个Item出现NullPointerException的异常
- ListView遍历每个Item出现NullPointerException的异常
- ListView遍历每个Item出现NullPointerException的异常
- ListView遍历每个Item出现NullPointerException的异常
- ListView遍历每个Item出现NullPointerException的异常处理(转)
- 在Servlet使用getServletContext()获取ServletContext对象出现java.lang.NullPointerException(空指针)异常的解决办法
- 在Servlet使用getServletContext()获取ServletContext对象出现java.lang.NullPointerException(空指针)异常的解决办法
- 使用Butterknife注解出现nullPointerException异常
- 在Servlet使用getServletContext()获取ServletContext对象出现java.lang.NullPointerException(空指针)异常的解决办法
- RelativeLayout执行measure(w,h)方法时,出现NullPointerException的异常情况
- JavaWeb项目在MyEclipse中调试出现java.lang.NullPointerException异常时的处理
- RelativeLayout执行measure(w,h)方法时,出现NullPointerException的异常情况
- 在Servlet使用getServletContext()获取ServletContext对象出现java.lang.NullPointerException(空指针)异常的解决办法
- ScrollView嵌套ListView,listItem.measure(0,0);报空指针异常NullPointerException
- Hibernate查询,数据库中无数据正常,有数据出现java.lang.NullPointerException 空指针异常
- Android兼容性问题 -- RelativeLayout.mesure()出现NullPointerException异常
- 关于listview.getcount()出现nullpointer exception的解决方案
- RelativeLayout执行measure(w,h)方法时,出现NullPointerException的异常情况
- Hibernate查询,无数据正常,有数据出现java.lang.NullPointerException 异常
- JavaWeb学习(5.5)---在Servlet使用getServletContext()获取ServletContext对象出现java.lang.NullPointerException(空指针)异常的解决办法