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