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>
ListView遍历每个Item出现NullPointerException的异常处理(转)的更多相关文章
- ListView遍历每个Item出现NullPointerException的异常
在使用ListView过程中我们有时候需要遍历取得每个Item项中的一些数据(比如每个Item里面有TextView,需要获取它的文本等等),但是我们在遍历过程中经常会遇到NullPointerExc ...
- ListView遍历每个Item出现NullPointerException的异常(转)
在使用ListView过程中我们有时候需要遍历取得每个Item项中的一些数据(比如每个Item里面有TextView,需要获取它的文本等等),但是我们在遍历过程中经常会遇到NullPointerExc ...
- RN中listView的每个item等高
今天写ListView的每个Item的布局的时候发现,当文字太长时被截掉了不能完全显示,检查了很久发现没有设置固定高度都是可伸缩的为什么没有伸缩呢.看了很久才发现每个item是等高的,于是仔细检查才看 ...
- Android中Listview点击item不变颜色以及设置listselector 无效
Android中Listview点击item不变颜色以及设置listselector 无效 这是同一个问题,Listview中点击item是会变颜色的,因为listview设置了默认的listsele ...
- listview指定某item的点击效果
需求:listview的某些item能够点击,需要点击效果,有些item不能点击,需要屏蔽点击效果. 实现: 1.layout: <ListView android:id="@+id/ ...
- Android ListView实现不同item的方法和原理分析
ListView实现不同item的方法和原理分析 一问题抛出Listview是android里面的重要组件,用来显示一个竖向列表,这个没有什么问题:但是有个时候列表里面的item不是一样的,如下图,列 ...
- 利用ListView批量删除item
利用CheckBox选中一个或多个item,最后批量删除它们. 程序运行效果图如下: package com.test.adapter; import java.util.ArrayList; imp ...
- Android处理ListView中的Item中的Button按钮不能点击的问题
问题描述:ListView列表中的Button按钮按钮不能点击 解决办法:在ListView中的Item项的布局文件中加上:android:descendantFocusability="b ...
- ListView点击Item展开隐藏项(单项展开、多项展开、复杂布局时的展开处理)
手机屏幕毕竟有限,当我们要显示较多数据时便不得不舍去一些次要信息.将主要信息优先显示,也使显示效果更加简洁美观.遇到类似的需求,我们使用最多的就是 ListView ,而假设每次点击一个 Item 都 ...
随机推荐
- 邮件发布google blogger 博客
<?php $to = "@gmail.com";$subject = "Test mail";$message = "Hello! This ...
- div+css位置绝对定位和相对定位
position:absolute: 当div中被隔着些元素的话那么用此方法将把元素重叠在一起,所以元素可以不在容器中加也能重叠在一起
- 模拟摇奖:从1-36中随机抽出8个不重复的数字(math)
public class Yaojiang { public static void main(String[] args) { // TODO 自动生成的方法存根 int[] a=new int[8 ...
- jquery:赋值
Jquery的赋值语句 $("#txtStyle").val(value); 获取操作: var val = $('#test').val(); --
- oc拨打电话
判断当前设备是否支持电话功能 +(int)isCanCall{ if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad || [[[UIDevi ...
- Entity Framework 学习高级篇2—改善EF代码的方法(下)
,IQueryable<Customers>>( (database) => database.Customers.Where(c => c.City == " ...
- Qt学习之系列[9] – QCoreApplication:processEvents()可能会引起递归,导致栈溢出崩溃
api含义:QCoreApplication::processEvents() 将处理所有事件队列中的事件并返回给调用者. 问题描述: 当主线程在某个槽函数里正在执行processEvents时, 刚 ...
- Hibernate4 占位符(?)
Hibernate3使用?占位符: Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); ...
- iptables查看、添加、删除规则
1.查看iptables -nvL –line-number -L 查看当前表的所有规则,默认查看的是filter表,如果要查看NAT表,可以加上-t NAT参数-n 不对ip地址进行反查,加上这个参 ...
- js监听键盘方向键事件
<SCRIPT language=javascript> document.onkeydown = chang_page; function chang_page() { || ) loc ...