为了账号安全,请及时绑定邮箱和手机立即绑定

在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 关注
  • 194 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信