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