我有项目清单。

我要长时间删除一个项目。

我看到了这篇文章,它为我工作。

出于好奇,我想知道为什么其他解决方案对我不起作用:

溶胶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;
        }
    });

我知道setOnItemLongClickListenersetOnLongClickListener更适合我的需求,但是

为什么这对我不起作用?

最佳答案

两者之间有区别吗

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时只会发现很少的情况,其中一些是优化技巧。

07-24 09:47
查看更多