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