Thor1401
Thor1401

Reputation: 140

Android Listview when long Press a ContextMenu is shown with deleting file option

I have some troubles with my code. In a listView, when I Long Press a ContextMenu is shown. An option for deleting a file is shown. But when I press delete in the ContextMenu the app force close.

Any ideas ? thanks in advance

Here is my code

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();
    }  

Here is my LogCat

10-17 19:10:32.621: E/InputEventReceiver(25683): Exception dispatching input event. 10-17 19:10:32.621: E/MessageQueue-JNI(25683): Exception in MessageQueue callback: handleReceiveCallback 10-17 19:10:32.641: E/MessageQueue-JNI(25683): java.lang.NullPointerException 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at tbj.android.basketballstatistics.ShowListActivity.function2(ShowListActivity.java:92) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at tbj.android.basketballstatistics.ShowListActivity.onContextItemSelected(ShowListActivity.java:79) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.app.Activity.onMenuItemSelected(Activity.java:2620) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at com.android.internal.policy.impl.PhoneWindow$DialogMenuCallback.onMenuItemSelected(PhoneWindow.java:4129) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:741) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:884) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at com.android.internal.view.menu.MenuDialogHelper.onClick(MenuDialogHelper.java:167) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:941) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.widget.AdapterView.performItemClick(AdapterView.java:298) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.widget.AbsListView.performItemClick(AbsListView.java:1113) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2911) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.widget.AbsListView.onTouchUp(AbsListView.java:3657) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.widget.AbsListView.onTouchEvent(AbsListView.java:3436) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.View.dispatchTouchEvent(View.java:7713) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2210) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2329) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1568) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.app.Dialog.dispatchTouchEvent(Dialog.java:746) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2277) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.View.dispatchPointerEvent(View.java:7893) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3950) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3829) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3395) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3445) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3414) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3521) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3422) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3578) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3395) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3445) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3414) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3422) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3395) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5535) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5515) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5486) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5615) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) 10-17 19:10:32.641: E/MessageQueue-JNI(25683): at android.os.MessageQueue.nativePollO 10-17 19:10:32.641: D/AndroidRuntime(25683): Shutting down VM 10-17 19:10:32.641: W/dalvikvm(25683): threadid=1: thread exiting with uncaught exception (group=0x41642db8) 10-17 19:10:32.641: E/AndroidRuntime(25683): FATAL EXCEPTION: main 10-17 19:10:32.641: E/AndroidRuntime(25683): Process: tbj.android.basketballstatistics, PID: 25683 10-17 19:10:32.641: E/AndroidRuntime(25683): java.lang.NullPointerException 10-17 19:10:32.641: E/AndroidRuntime(25683): at tbj.android.basketballstatistics.ShowListActivity.function2(ShowListActivity.java:92) 10-17 19:10:32.641: E/AndroidRuntime(25683): at tbj.android.basketballstatistics.ShowListActivity.onContextItemSelected(ShowListActivity.java:79) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.app.Activity.onMenuItemSelected(Activity.java:2620) 10-17 19:10:32.641: E/AndroidRuntime(25683): at com.android.internal.policy.impl.PhoneWindow$DialogMenuCallback.onMenuItemSelected(PhoneWindow.java:4129) 10-17 19:10:32.641: E/AndroidRuntime(25683): at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:741) 10-17 19:10:32.641: E/AndroidRuntime(25683): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152) 10-17 19:10:32.641: E/AndroidRuntime(25683): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:884) 10-17 19:10:32.641: E/AndroidRuntime(25683): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874) 10-17 19:10:32.641: E/AndroidRuntime(25683): at com.android.internal.view.menu.MenuDialogHelper.onClick(MenuDialogHelper.java:167) 10-17 19:10:32.641: E/AndroidRuntime(25683): at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:941) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.widget.AdapterView.performItemClick(AdapterView.java:298) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.widget.AbsListView.performItemClick(AbsListView.java:1113) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2911) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.widget.AbsListView.onTouchUp(AbsListView.java:3657) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.widget.AbsListView.onTouchEvent(AbsListView.java:3436) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.View.dispatchTouchEvent(View.java:7713) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2210) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 10-17 19:10:32.641: E/AndroidRuntime(25683): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2329) 10-17 19:10:32.641: E/AndroidRuntime(25683): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1568) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.app.Dialog.dispatchTouchEvent(Dialog.java:746) 10-17 19:10:32.641: E/AndroidRuntime(25683): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2277) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.View.dispatchPointerEvent(View.java:7893) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3950) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3829) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3395) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3445) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3414) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3521) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3422) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3578) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3395) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3445) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3414) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3422) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3395) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5535) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5515) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5486) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5615) 10-17 19:10:32.641: E/AndroidRuntime(25683): at android.view.InputEventReceiver.dispatchInput

Upvotes: 0

Views: 296

Answers (2)

sigmabeta
sigmabeta

Reputation: 1184

It's difficult to know what is going wrong here because we don't know what line numbers correspond to the lines of code you have included. But to give you a starting point of how I would solve this problem:

Generally when an Android application crashes, you want to be searching your log for where it says FATAL EXCEPTION:. In this case, Android is telling you that the event that broke everything was a NullPointerException at line 92 of the file ShowListActivity.java. So you should look there and see what could possibly be wrong with it.

My guess is that what is wrong is you are using item.getActionView() incorrectly. I think what you're trying to do is to get the TextView that the user is trying to delete; but item does not refer to the "item" the user is trying to delete, but rather the MenuItem the user clicked on in order to tell the app to delete that list member.

getActionView() also doesn't return anything other than null unless you've previously called setActionView() on that MenuItem; and the only reason you would ever want to do this is if you wanted to set some really complex view to represent that action (an icon or a text field is not complex, as far as what I am talking about.)

The correct way to do what you're trying to accomplish would be to store some sort of identifier for the item the user is going to act on at the time you create the context menu, before the user chooses what to do with it; perhaps in a member variable of some sort. Then tell your function2 method to act using that identifier.

Upvotes: 1

Nayra Ahmed
Nayra Ahmed

Reputation: 655

I think you can save the position of the long pressed row in a global variable lets say private int pos; and make pos = index in setOnItemLongClickListener then in function2 get the product name from the array you use to fill the listview using pos

hope that will help

Upvotes: 0

Related Questions