亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在android中列表視圖很大時選擇列表項時出錯?

在android中列表視圖很大時選擇列表項時出錯?

素胚勾勒不出你 2021-08-04 16:51:33
目前我正在 Android 中制作一個應用程序,它是一個待辦事項列表,它有一個編輯文本、按鈕和一個列表視圖,當單擊按鈕時,文本被添加到列表視圖,一切正常,但是當我向列表視圖添加太多項目時嘗試選擇我的應用程序停止工作的列表項,我收到一條錯誤消息,說 java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference有人知道修復嗎?這是我的視圖數據方法,它在列表視圖中顯示項目public void viewdata(String tablename){    db = new mydbhandler(this);    lvitemslist = findViewById(R.id.lvitemlist);    ArrayList mylist = new ArrayList();    Cursor c = db.getdata(tablename);    while(c.moveToNext())    {        mylist.add(c.getString(1));    }    ListAdapter mylistadapter = new ArrayAdapter(this,R.layout.custom_item_row,R.id.ctv,mylist);    lvitemslist.setAdapter(mylistadapter);}這是 onitemclicklistenerlvitemslist.setOnItemClickListener(new AdapterView.OnItemClickListener() {        @Override        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {            View v = lvitemslist.getChildAt(i);            CheckedTextView ctv = v.findViewById(R.id.ctv);                ctv.setCheckMarkDrawable(android.R.drawable.checkbox_on_background);db.deletedata(tablename,ctv.getText().toString());視圖數據(表名);
查看完整描述

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()適配器。


查看完整回答
反對 回復 2021-08-04
  • 1 回答
  • 0 關注
  • 217 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號