【问题标题】:Android Listview when long Press a ContextMenu is shown with deleting file option长按 ContextMenu 时的 Android Listview 显示删除文件选项
【发布时间】:2014-10-17 16:41:13
【问题描述】:

我的代码有些问题。 在 listView 中,当我长按时会显示 ContextMenu。显示删除文件的选项。 但是当我在 ContextMenu 中按下删除时,应用程序强制关闭。

有什么想法吗? 提前致谢

这是我的代码

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

        public boolean onItemLongClick(AdapterView<?> arg0, View v,
                int index, long arg3) {

            registerForContextMenu(listView);  
            return false;
        }
});         

}

public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {  
    super.onCreateContextMenu(menu, v, menuInfo);  
        menu.setHeaderTitle("Options");  
        menu.add(0, v.getId(), 0, "Change Name");  
        menu.add(0, v.getId(), 0, "Delete");  
    }  

    @Override  
    public boolean onContextItemSelected(MenuItem item) {  
        if(item.getTitle()=="Change Name"){function1(item.getActionView(), item.getItemId());}  
        else if(item.getTitle()=="Delete"){function2(item.getActionView(), item.getItemId());}  
        else {return false;}  
    return true;  
    }  

    public void function1(View view, int id){  
       //Change Name Code
    }  
    public void function2(View view, int id){  
        String product = ((TextView)view).getText().toString();
      File dir = getFilesDir();
      File file = new File(dir, (product));
      boolean deleted = file.delete();

        Toast.makeText(ShowListActivity.this, R.string.deleted, Toast.LENGTH_SHORT).show();
    }  

这是我的 LogCat

10-17 19:10:32.621:E/InputEventReceiver(25683):异常调度 输入事件。 10-17 19:10:32.621:E/MessageQueue-JNI(25683):异常 在 MessageQueue 回调中:handleReceiveCallback 10-17 19:10:32.641: E/MessageQueue-JNI(25683):java.lang.NullPointerException 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 tbj.android.basketballstatistics.ShowListActivity.function2(ShowListActivity.java:92) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 tbj.android.basketballstatistics.ShowListActivity.onContextItemSelected(ShowListActivity.java:79) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.app.Activity.onMenuItemSelected(Activity.java:2620) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 com.android.internal.policy.impl.PhoneWindow$DialogMenuCallback.onMenuItemSelected(PhoneWindow.java:4129) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:741) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:884) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 com.android.internal.view.menu.MenuDialogHelper.onClick(MenuDialogHelper.java:167) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:941) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.widget.AdapterView.performItemClick(AdapterView.java:298) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.widget.AbsListView.performItemClick(AbsListView.java:1113) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.widget.AbsListView$PerformClick.run(AbsListView.java:2911) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.widget.AbsListView.onTouchUp(AbsListView.java:3657) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.widget.AbsListView.onTouchEvent(AbsListView.java:3436) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.View.dispatchTouchEvent(View.java:7713) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2210) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2329) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1568) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.app.Dialog.dispatchTouchEvent(Dialog.java:746) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2277) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.View.dispatchPointerEvent(View.java:7893) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3950) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3829) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3395) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3445) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3414) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3521) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3422) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3578) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3395) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3445) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3414) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3422) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3395) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5535) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5515) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5486) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5615) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) 10-17 19:10:32.641:E/MessageQueue-JNI(25683):在 android.os.MessageQueue.nativePollO 10-17 19:10:32.641: D/AndroidRuntime(25683): 关闭 VM 10-17 19:10:32.641: W/dalvikvm(25683): threadid=1: 线程以未捕获的异常退出 (组=0x41642db8)10-17 19:10:32.641:E/AndroidRuntime(25683):致命 例外:主 10-17 19:10:32.641:E/AndroidRuntime(25683):进程: tbj.android.basketballstatistics, PID: 25683 10-17 19:10:32.641: E/AndroidRuntime(25683):java.lang.NullPointerException 10-17 19:10:3​​2.641:E/AndroidRuntime(25683):在 tbj.android.basketballstatistics.ShowListActivity.function2(ShowListActivity.java:92) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 tbj.android.basketballstatistics.ShowListActivity.onContextItemSelected(ShowListActivity.java:79) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.app.Activity.onMenuItemSelected(Activity.java:2620) 10-17 19:10:3​​2.641:E/AndroidRuntime(25683):在 com.android.internal.policy.impl.PhoneWindow$DialogMenuCallback.onMenuItemSelected(PhoneWindow.java:4129) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:741) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:884) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 com.android.internal.view.menu.MenuDialogHelper.onClick(MenuDialogHelper.java:167) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:941) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.widget.AdapterView.performItemClick(AdapterView.java:298) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.widget.AbsListView.performItemClick(AbsListView.java:1113) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.widget.AbsListView$PerformClick.run(AbsListView.java:2911) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.widget.AbsListView.onTouchUp(AbsListView.java:3657) 10-17 19:10:3​​2.641:E/AndroidRuntime(25683):在 android.widget.AbsListView.onTouchEvent(AbsListView.java:3436) 10-17 19:10:3​​2.641:E/AndroidRuntime(25683):在 android.view.View.dispatchTouchEvent(View.java:7713) 10-17 19:10:3​​2.641:E/AndroidRuntime(25683):在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2210) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945) 10-17 19:10:3​​2.641:E/AndroidRuntime(25683):在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 10-17 19:10:3​​2.641:E/AndroidRuntime(25683):在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 10-17 19:10:3​​2.641:E/AndroidRuntime(25683):在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 10-17 19:10:3​​2.641:E/AndroidRuntime(25683):在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 10-17 19:10:3​​2.641:E/AndroidRuntime(25683):在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 10-17 19:10:3​​2.641:E/AndroidRuntime(25683):在 com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2329) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1568) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.app.Dialog.dispatchTouchEvent(Dialog.java:746) 10-17 19:10:3​​2.641:E/AndroidRuntime(25683):在 com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2277) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.view.View.dispatchPointerEvent(View.java:7893) 10-17 19:10:3​​2.641:E/AndroidRuntime(25683):在 android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3950) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3829) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3395) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3445) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3414) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3521) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3422) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3578) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3395) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3445) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3414) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3422) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3395) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5535) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5515) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5486) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5615) 10-17 19:10:32.641: E/AndroidRuntime(25683): 在 android.view.InputEventReceiver.dispatchInput

【问题讨论】:

  • 你能显示日志输出以便我们更好地了解错误吗?
  • @j2emanue 我的 logcat 现在可用
  • 执行function2时出现NullPointerException,所以在这个函数上使用调试。您是否获得了 textview 的参考?在列表视图上使用 OnItemLongClickListener 获取产品名称。

标签: android listview


【解决方案1】:

很难知道这里出了什么问题,因为我们不知道哪些行号对应于您包含的代码行。但是给你一个我将如何解决这个问题的起点:

通常,当 Android 应用程序崩溃时,您希望在日志中搜索 FATAL EXCEPTION: 的位置。在这种情况下,Android 告诉您破坏一切的事件是文件ShowListActivity.java 第 92 行的 NullPointerException。所以你应该看看那里,看看它可能有什么问题。

我的猜测是你错误地使用了item.getActionView()。我认为您要做的是获取用户尝试删除的 TextView ;但item 不是指用户试图删除的“项目”,而是指用户单击以告诉应用程序删除该列表成员的MenuItem

getActionView() 也不会返回除null 以外的任何内容,除非您之前在该MenuItem 上调用过setActionView();您想要这样做的唯一原因是,如果您想设置一些非常复杂的视图来表示该操作(图标或文本字段并不复杂,就我所说的而言。)

执行您想要完成的工作的正确方法是为用户将要操作的项目存储某种标识符在您创建上下文菜单时,用户选择如何处理它;也许在某种成员变量中。然后告诉您的 function2 方法使用该标识符进行操作。

【讨论】:

  • 一般来说,你实现这个上下文菜单的方式是非常不正统的,会给你自己带来很多额外的工作。例如,您不应在 onCreateContextMenu 中定义菜单选项,而应在外部 XML 文件中定义。您应该考虑查看上下文菜单上的 Android 文档:developer.android.com/guide/topics/ui/menus.html#context-menu
【解决方案2】:

我认为您可以将长按行的位置保存在全局变量中,比如说 private int pos; 并在 setOnItemLongClickListener 中设置 pos = index,然后在 function2 中从用于使用 pos 填充列表视图的数组中获取产品名称

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多