我有项目清单。
我要长时间删除一个项目。
我看到了这篇文章,它为我工作。
出于好奇,我想知道为什么其他解决方案对我不起作用:
溶胶1
我将列表注册到上下文菜单:registerForContextMenu(listView);
然后:
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo) {
if (v.getId()==R.id.comments_list) {
MenuInflater inflater = getActivity().getMenuInflater();
inflater.inflate(R.menu.phone_list_contextual_menu, menu);
}
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
switch(item.getItemId()) {
case R.id.edit: {
return true;
}
case R.id.delete: {
comments.remove(info.id);
listView.invalidate();
return true;
}
default: {
return super.onContextItemSelected(item);
}
}
}
两者之间有区别吗
listView.invalidate()
和adapter.notifyDataHasChanged()
吗?在通话主题旁边?我需要什么才能使删除工作?
溶胶2
listView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int position = (int) v.getTag();
comments.remove(position);
listView.invalidate();
return true;
}
});
代替
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){
@Override
public boolean onItemLongClick(AdapterView<?> av, View v, int pos, long id) {
comments.remove(pos);
//listView.invalidate();
arrayAdapter.notifyDataSetChanged();
return true;
}
});
我知道
setOnItemLongClickListener
比setOnLongClickListener
更适合我的需求,但是为什么这对我不起作用?
最佳答案
两者之间有区别吗
listView.invalidate()和adapter.notifyDataHasChanged()吗?在通话主题旁边?
据我所知,adapter.notifyDataHasChanged()将做listView.invalidate()以及其他工作。这意味着它还将包括项目数量的更改,并可能将数据更改通知其他观察者。相关代码在这里:
http://androidxref.com/5.0.0_r2/xref/frameworks/base/core/java/android/widget/AdapterView.java#798
这是用于notifyDataHasChanged()的,因为您可以看到mItemCount带有新值。这意味着,如果您向arrayadapter中添加更多项,则使invalidateViews失效,或者更好的invalidateViews至少在列表末尾将不会显示它们。我注意到的一件事是上面的代码没有无效调用-可能是由其他方法调用的。
下面是invalidateViews的源代码(我认为它比Invalidate更合适):
http://androidxref.com/5.0.0_r2/xref/frameworks/base/core/java/android/widget/AbsListView.java#5078
它没有代码来更新项目计数。
如果您在源代码中搜索android源代码,则在调用invalidateViews时只会发现很少的情况,其中一些是优化技巧。