Android 调用getView时,什么设置最大位置值?(缩小列表视图)

Android 调用getView时,什么设置最大位置值?(缩小列表视图),android,Android,我正在显示一个ListView,一开始它工作得很好-所有内容都显示并滚动正常。ListView中有12项。然后我尝试减少ListView中的项目数,因此我减小了dataset的大小,它在适配器的getView()中崩溃,因为调用getView()时,位置值对于新的较小列表来说太大,导致数组索引超出范围 源代码片段: 在onCreate()中,我将listview附加到XML setContentView(R.layout.mylist); lv = getListView(); 我

我正在显示一个ListView,一开始它工作得很好-所有内容都显示并滚动正常。ListView中有12项。然后我尝试减少ListView中的项目数,因此我减小了dataset的大小,它在适配器的getView()中崩溃,因为调用getView()时,位置值对于新的较小列表来说太大,导致数组索引超出范围

源代码片段:

在onCreate()中,我将listview附加到XML

   setContentView(R.layout.mylist);
   lv = getListView();
我创建适配器并绑定它

mylistadapter = new MyListAdapter(MyListActivity.this);
setListAdapter(mylistadapter);   // bind the adapter
…数据源是名为listItems的ArrayList。第一次有12个项目;之后我清除它并添加6项

public static ArrayList<String>listItems=new ArrayList<String>();
为了验证notifyDataSetChanged()是否被调用,我编写了一份详细的日志记录,并向自己证明它确实被调用了。无论是否使用此覆盖,行为都是相同的

// just overriding notifyDataSetChanged() to instrument it
@Override
public void notifyDataSetChanged() 
{
    Log.e ("notifyDataSetChanged()...",   "listItems.size()=" + String.valueOf(listItems.size()) + "  lv.getCount()=" + String.valueOf(lv.getCount()) );   //!! debugging
    super.notifyDataSetChanged();
}   
getView()如下所示。它在BOOM注释处爆炸,因为位置是6,而listItems只有6个项目([0]-[5]


由于适配器知道其数据集中只有6个项,listItems,因此它应该只使用[0]-[5]调用getView(),但实际上它使用高达[11]的位置值调用它,这是旧列表的最大值。这就是它崩溃的原因。您可以看到我从何处获得ListView的计数,用于诊断;它也是6。那么较高的位置值来自何处?

清除ListView后是否调用了
notifyDataSetChanged();

@Override
public void clear()
{
    listItems.clear();
    notifyDataSetChanged();
}
是的,正如我所说:quote:“在我清除它并添加6个新项之后,我调用NOTIFYDATASETCHENGED()
@Override
    public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    boolean select;

        Log.e ("getView() ...  " , "position=" + String.valueOf(position) + 
                   " AdapterCount=" + String.valueOf(getCount()) + "..." );   //!! debugging            
        if (convertView == null) {      
            LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = vi.inflate(R.layout.mylistitem, null);
            //This is still needed even though we point to an XML description
            convertView.setLayoutParams(new ListView.LayoutParams(
                    ListView.LayoutParams.MATCH_PARENT,
                    ListView.LayoutParams.MATCH_PARENT));
            holder = new ViewHolder();

            convertView.setTag(holder);
            holder.cV1.setTag(holder);  //These views need tags for onClick()
        }
        else {
            holder = (ViewHolder)convertView.getTag();
        }
        int lvCount = lv.getCount();  // for debugging
        //Must set this in both cases        
        holder.itemView.setText(listItems.get(position));  //BOOM


        return convertView;

    }  // end getView
@Override
public void clear()
{
    listItems.clear();
    notifyDataSetChanged();
}