Android 在ListView setMultiChoiceListener方法中获取空指针异常

Android 在ListView setMultiChoiceListener方法中获取空指针异常,android,listview,nullpointerexception,Android,Listview,Nullpointerexception,我打算用Class Contact的对象填充一个列表视图,该对象包含联系人的姓名、电话号码和图像。我已经设法创建了一个,下一个我需要实现的是一个“删除”功能,通过长按我从操作栏中选择删除选项获得的项目。除了选择列表上的最后一个项目外,一切都正常。我在setBackgroundColor(getResources()…)部分得到一个空指针异常。我已将“try…catch”添加到代码的if部分,但列表中最后一项的选择和删除操作仍不起作用 if (checked) {

我打算用Class Contact的对象填充一个
列表视图
,该对象包含联系人的姓名、电话号码和图像。我已经设法创建了一个,下一个我需要实现的是一个“删除”功能,通过长按我从操作栏中选择删除选项获得的项目。除了选择列表上的最后一个项目外,一切都正常。我在
setBackgroundColor(getResources()…)
部分得到一个空指针异常。我已将“
try
catch
”添加到代码的
if
部分,但列表中最后一项的选择和删除操作仍不起作用

if (checked) {
                try {
                    listView.getChildAt(position).setBackgroundColor(getResources().getColor(R.color.darkblue));
                    Contact prsntoArray = (Contact) personDlt;
                    dltPersonsList.add(prsntoArray);
                } catch (NullPointerException e) {
                    e.printStackTrace();
                }
            } else {
                listView.getChildAt(position).setBackgroundColor(getResources().getColor(R.color.abc_background_cache_hint_selector_material_light));
                dltPersonsList.remove(personDlt);

            }
这是应用程序的整个onCreate方法

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.show_contacts_listview);
    final ListView listView = (ListView) findViewById(R.id.listview);

    DatabaseHandler db = new DatabaseHandler(getApplicationContext());
    List<Contact> contactList = db.getAllContacts();
    listAdapter = new ListAdapter(this, R.layout.contact_view_item,contactList);
    listView.setAdapter(listAdapter);
    listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);

    listView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
        @Override
        public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
            // Capture total checked items
            final int checkedCount = listView.getCheckedItemCount();
            // Set the CAB title according to total checked items
            mode.setTitle(checkedCount + " Selected");
            personDlt = listView.getItemAtPosition(position);
            if (checked) {
                try {
                    listView.getChildAt(position).setBackgroundColor(getResources().getColor(R.color.darkblue));
                    Contact prsntoArray = (Contact) personDlt;
                    dltPersonsList.add(prsntoArray);
                } catch (NullPointerException e) {
                    e.printStackTrace();
                }
            } else {
                listView.getChildAt(position).setBackgroundColor(getResources().getColor(R.color.abc_background_cache_hint_selector_material_light));
                dltPersonsList.remove(personDlt);

            }
            // Calls toggleSelection method from ListViewAdapter Class
            listAdapter.toggleSelection(position);
        }

        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            mode.getMenuInflater().inflate(R.menu.menu_main, menu);
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false;
        }

        // Called when the user selects a contextual menu item
        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            switch (item.getItemId()) {
                case R.id.delete:
                    SparseBooleanArray selected = listAdapter.getSelectedIds();
                    for (int i = (selected.size() - 1); i >= 0; i--) {
                        if (selected.valueAt(i)) {
                            Contact selecteditem = listAdapter
                                    .getItem(selected.keyAt(i));
                            // Remove selected items following the ids
                            listAdapter.remove(selecteditem);
                        }
                    }
                    Iterator<Contact> dltIter = dltPersonsList.iterator();
                    do {

                        Contact dltContct = dltIter.next();
                        DatabaseHandler db = new DatabaseHandler(getApplicationContext());
                        db.deleteContact(dltContct);

                    } while (dltIter.hasNext());


                    // Close CAB
                    mode.finish();
                    return true;
                default:
                    return false;
            }

        }

        @Override
        public void onDestroyActionMode(ActionMode mode) {
            listAdapter.removeSelection();

        }
    });}
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.show_contacts_listview);
最终ListView ListView=(ListView)findViewById(R.id.ListView);
DatabaseHandler db=新的DatabaseHandler(getApplicationContext());
List contactList=db.getAllContacts();
listAdapter=新listAdapter(此,R.layout.contact\u视图\u项,contactList);
setAdapter(listAdapter);
listView.setChoiceMode(listView.CHOICE\u MODE\u MULTIPLE\u MODE);
setMultichoiceModelListener(新的AbsListView.MultichoiceModelListener(){
@凌驾
public void onItemCheckedStateChanged(ActionMode模式、int位置、长id、布尔选中){
//捕获已检查的项目总数
final int checkedCount=listView.getCheckedItemCount();
//根据总检查项目设置驾驶室标题
mode.setTitle(checkedCount+“选中”);
personDlt=listView.getItemAtPosition(位置);
如果(选中){
试一试{
getChildAt(position).setBackgroundColor(getResources().getColor(R.color.darkblue));
Contact prsnotarray=(Contact)personDlt;
dltPersonsList.add(prsnotarray);
}捕获(NullPointerException e){
e、 printStackTrace();
}
}否则{
getChildAt(位置).setBackgroundColor(getResources().getColor(R.color.abc_background_cache_hint_selector_material_light));
dltPersonsList.remove(personDlt);
}
//从ListViewAdapter类调用toggleSelection方法
listAdapter.toggleSelection(位置);
}
@凌驾
公共布尔onCreateActionMode(ActionMode模式,菜单){
mode.getMenuInflater().充气(R.menu.menu\u主菜单,菜单);
返回true;
}
@凌驾
公共布尔onPrepareActionMode(操作模式,菜单){
返回false;
}
//当用户选择上下文菜单项时调用
@凌驾
公共布尔值onActionItemClicked(ActionMode模式,菜单项){
开关(item.getItemId()){
案例R.id.delete:
SparseBooleanArray selected=listAdapter.GetSelectedId();
对于(int i=(selected.size()-1);i>=0;i--){
如果(选定。值位于(i)){
请联系selecteditem=listAdapter
.getItem(选定的.keyAt(i));
//删除ID后面的选定项目
listAdapter.remove(选择编辑项);
}
}
迭代器dltIter=dltPersonsList.Iterator();
做{
联系dltContct=dltIter.next();
DatabaseHandler db=新的DatabaseHandler(getApplicationContext());
db.deleteContact(dltContct);
}while(dltIter.hasNext());
//封闭式驾驶室
mode.finish();
返回true;
违约:
返回false;
}
}
@凌驾
公共void onDestroyActionMode(ActionMode模式){
listAdapter.removeSelection();
}
});}

您在单个
getChildAt
调用中添加了一个try块

您应该只执行空检查:

if (listView.getChildAt(position) != null) {
    if (checked) {
        listView.getChildAt(position)
                .setBackgroundColor(getResources().getColor(R.color.darkblue));
        Contact prsntoArray = (Contact) personDlt;
        dltPersonsList.add(prsntoArray);
    } else {
        listView.getChildAt(position).setBackgroundColor(getResources()
                .getColor(R.color.abc_background_cache_hint_selector_material_light));
        dltPersonsList.remove(personDlt);
    }
}


请记住,ListView会重新使用视图,因此在滚动时,背景可能会应用于其他项目。当然,如果您的适配器中没有管理这些状态的任何特定代码,就需要这样做。但是,这超出了这个问题的范围。

嗨,Simas,我仍然无法选择列表中的最后一项。另外,如果我选择了列表中的第一项,那么列表中的最后一项也会自动被选中。代码有问题吗?