1 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超2個(gè)贊
看看你的這一行OnItemClickListener:
View v = lvitemslist.getChildAt(i);
我猜您想將ListView單擊的行分配給變量v。但是ViewGroup方法getChildAt(int)(ListView是一種ViewGroup)會(huì)給你
指定位置的視圖,如果該位置不存在于組中,則為 null
就像你說的,這適用于前幾個(gè)項(xiàng)目,但對于更高的位置,應(yīng)用程序崩潰。這是因?yàn)閟ListView有固定數(shù)量的 child View:大約與屏幕上同時(shí)顯示的數(shù)量一樣多,再加上一些以實(shí)現(xiàn)平滑滾動(dòng)。對于超出該固定數(shù)字的每個(gè)點(diǎn)擊行,lvitemslist.getChildAt(i)將返回null.
你能做些什么來修復(fù)你的代碼?
幸運(yùn)的是,您無需做太多工作即可獲得 clicked View,它作為 的參數(shù)之一傳遞給您onItemClick():第二個(gè)參數(shù)是被點(diǎn)擊的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通過調(diào)用從適配器外部更改行的外觀
ctv.setCheckMarkDrawable(android.R.drawable.checkbox_on_background);
這是危險(xiǎn)的(這個(gè)網(wǎng)站上有很多問題,結(jié)果人們在滾動(dòng)時(shí)會(huì)有奇怪的行為)。在您的情況下這可能不是問題,因?yàn)槟鶯istView很快就會(huì)刷新整體。但通常應(yīng)該為適配器提供決定每一行應(yīng)該是什么樣子的所有必要數(shù)據(jù)。然后可以更改數(shù)據(jù)列表,然后當(dāng)然調(diào)用notifyDatasetChanged()適配器。
添加回答
舉報(bào)