ListView遍歷每一個Item出現NullPointerException的異常

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

 

[java]  view plain  copy
 
  1. package com.jackchan.listviewexception;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.util.Log;  
  6. import android.view.LayoutInflater;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.view.ViewGroup;  
  10. import android.widget.BaseAdapter;  
  11. import android.widget.Button;  
  12. import android.widget.LinearLayout;  
  13. import android.widget.ListView;  
  14. import android.widget.TextView;  
  15.   
  16. public class MainActivity extends Activity {  
  17.       
  18.     private ListView mListView;  
  19.     private Button btn;  
  20.     private String[] items = new String[]{"Item1","Item2","Item3","Item4","Item5","Item6",  
  21.             "Item7","Item8","Item9","Item10","Item11","Item12","Item13","Item14","Item15","Item16","Item17","Item18"  
  22.             };  
  23.     @Override  
  24.     public void onCreate(Bundle savedInstanceState) {  
  25.         super.onCreate(savedInstanceState);  
  26.         setContentView(R.layout.main);  
  27.         mListView = (ListView)findViewById(R.id.listview);  
  28.         btn = (Button)findViewById(R.id.btn);  
  29.         mListView.setAdapter(new ListViewAdapter());  
  30.         btn.setOnClickListener(new OnClickListener() {  
  31.               
  32.             @Override  
  33.             public void onClick(View v) {  
  34.             //  for(int i = 0; i < mListView.getChildCount(); i++) 獲取屏幕上可顯示的Item數目  
  35.                 for(int i = 0; i < mListView.getCount(); i++)//獲取ListView的全部Item數目  
  36.                 {  
  37.                 //    LinearLayout linearlayout = (LinearLayout)mListView.getChildAt(i);  
  38.                     LinearLayout linearlayout = (LinearLayout)mListView.getAdapter().getView(i, null, null);  
  39.                     TextView textview = (TextView)linearlayout.getChildAt(0);  
  40.                     Log.d("text", textview.getText().toString());  
  41.                 }  
  42.             }  
  43.         });  
  44.     }  
  45.   
  46.     public class ViewHolder{  
  47.         TextView textview;  
  48.     }  
  49.       
  50.     private class ListViewAdapter extends BaseAdapter{  
  51.           
  52.           
  53.         @Override  
  54.         public int getCount() {  
  55.             // TODO Auto-generated method stub  
  56.             return items.length;  
  57.         }  
  58.   
  59.         @Override  
  60.         public Object getItem(int position) {  
  61.             // TODO Auto-generated method stub  
  62.             return null;  
  63.         }  
  64.   
  65.         @Override  
  66.         public long getItemId(int position) {  
  67.             // TODO Auto-generated method stub  
  68.             return 0;  
  69.         }  
  70.   
  71.         @Override  
  72.         public View getView(int position, View convertView, ViewGroup parent) {  
  73.             ViewHolder viewHolder = new ViewHolder();  
  74.             if(convertView == null){  
  75.                 convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.listviewitem, null);  
  76.                 viewHolder.textview = (TextView)convertView.findViewById(R.id.textview);  
  77.                 convertView.setTag(viewHolder);  
  78.             }  
  79.             else{  
  80.                 viewHolder = (ViewHolder)convertView.getTag();  
  81.             }  
  82.             viewHolder.textview.setText(items[position].toString());  
  83.             return convertView;  
  84.         }  
  85.           
  86.     }  
  87. }  


重點看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

 

 

[html]  view plain  copy
 
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"   
  5.     android:orientation="vertical">  
  6.     <Button  
  7.         android:id="@+id/btn"  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:text="changetext"  
  11.         />  
  12.     <ListView   
  13.         android:id="@+id/listview"  
  14.         android:layout_width="fill_parent"  
  15.         android:layout_height="wrap_content"  
  16.         />  
  17. </LinearLayout>  


listviewitem.xml

 

 


 
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:layout_width="match_parent"  
    4.     android:layout_height="match_parent"  
    5.     android:orientation="horizontal" >  
    6.     <TextView   
    7.         android:id="@+id/textview"  
    8.         android:layout_width="wrap_content"  
    9.         android:layout_height="wrap_content"  
    10.         android:textSize="20sp"  
    11.         />  
    12.   
    13. </LinearLayout>  
相關文章
相關標籤/搜索