ListView遍历每个Item出现NullPointerException的异常

it2022-05-05  100

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

转载于:https://www.cnblogs.com/sishahu/p/5501346.html

相关资源:各显卡算力对照表!

最新回复(0)