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()適配器。
添加回答
舉報