1 回答
TA贡献1784条经验 获得超2个赞
看看你的这一行OnItemClickListener:
View v = lvitemslist.getChildAt(i);
我猜您想将ListView单击的行分配给变量v。但是ViewGroup方法getChildAt(int)(ListView是一种ViewGroup)会给你
指定位置的视图,如果该位置不存在于组中,则为 null
就像你说的,这适用于前几个项目,但对于更高的位置,应用程序崩溃。这是因为sListView有固定数量的 child View:大约与屏幕上同时显示的数量一样多,再加上一些以实现平滑滚动。对于超出该固定数字的每个点击行,lvitemslist.getChildAt(i)将返回null.
你能做些什么来修复你的代码?
幸运的是,您无需做太多工作即可获得 clicked View,它作为 的参数之一传递给您onItemClick():第二个参数是被点击的ListView行。
所以你只需要写
lvitemslist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long rowId) {
CheckedTextView ctv = view.findViewById(R.id.ctv);
ctv.setCheckMarkDrawable(android.R.drawable.checkbox_on_background);
db.deletedata(tablename,ctv.getText().toString());
viewdata(tablename);
}
}
这将帮助您避免NullPointerException.
另一件事:您可以ListView通过调用从适配器外部更改行的外观
ctv.setCheckMarkDrawable(android.R.drawable.checkbox_on_background);
这是危险的(这个网站上有很多问题,结果人们在滚动时会有奇怪的行为)。在您的情况下这可能不是问题,因为您ListView很快就会刷新整体。但通常应该为适配器提供决定每一行应该是什么样子的所有必要数据。然后可以更改数据列表,然后当然调用notifyDatasetChanged()适配器。
添加回答
举报