在使用ListView过程当中咱们有时候须要遍历取得每一个Item项中的一些数据(好比每一个Item里面有TextView,须要获取它的文本等等),可是咱们在遍历过程当中常常会遇到NullPointerException的异常,其实这不过是listview中getCount()和getChildCount()这个两个函数的一些使用上的不一样致使的。html
getChildCount():这个函数是获取ListView在当前界面上可以被看到的(不是全部)Item的数目,由于ListView中当Item不少的时候,有些没法显示在屏幕上。java
getCount():这个函数就是能够获取ListView中可见的和不可见的全部Item项数目(附上该函数返回值的官方英文解释)android
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.) app
如今看一个例子ide
- 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.getCount(); 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() {
-
- return items.length;
- }
-
- @Override
- public Object getItem(int position) {
-
- return null;
- }
-
- @Override
- public long getItemId(int position) {
-
- 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遍历的目的。this
在for循环里还有一个被我注释起来的方法getChildAt();spa
getChildAt():这个函数是用来得到ListView的Item,它能取到的Item的最大值为当前可见的Item数目,好比,当前屏幕只能看到ListView的6个Item,但你调用了getChildAt(6),至关于要得到ListView第七个可见的Item,这个时候就会报出NullPointerException ,我在这里提供的解决方法就是调用adapter的getView方法,这个方法能够获取ListView的全部Item,mListView.getAdapter().getView(i, null, null);.net
ListView在Android开发中是常常用到的组件,除非只作展现功能,不然通常建议自定义Adapter,这样能够省去不少麻烦。最后附上两个.xml的代码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>
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>