Heinrich
Heinrich

Reputation: 1

Android: How to make a clickable ListView with a ContextMenu?

I have a clickable ListView and try to make a Context Menu for the Items but if I get a long click the first time it activates the onListItemClick Method instead. The next time it works. If I activate the Context Menu with openContextMenu it throws a StackOverflowError.

I resolved my problem! See at the end of this post.

My Activity:

@Override
public void onCreate(Bundle icicle) {

    super.onCreate(icicle);
    setContentView(R.layout.search);

    getWords(getIntent());      
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id); 
        String lemma = (item.get(position));

        Intent intent = new Intent(this, EntryActivity.class)
            .putExtra(CL.DOC, doc)
            .putExtra(CL.ENTRY, lemma);
    startActivity(intent);
}

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.setHeaderTitle("Eintrag");
    getMenuInflater().inflate(R.menu.context, menu);
}

public boolean onContextItemSelected(MenuItem item) {
    //TODO: switch
    return super.onContextItemSelected(item);
}

private void getWords(Intent intent) {
    doc = (CLDocument)intent.getSerializableExtra(CL.DOC);
    item = doc.getEntries();

    ArrayAdapter<String> fileList = 
        new ArrayAdapter<String>(this, R.layout.row, item);
    setListAdapter(fileList);   

    getListView().setOnItemLongClickListener(new OnItemLongClickListener() {    
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            registerForContextMenu(view);
            //openContextMenu(view);        
            return false;
        }
    });
}

My Layout (search.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <EditText
        android:id="@+id/edit_search"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:imeOptions="actionSearch"
        android:inputType="text"
        android:singleLine="true" />

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        />

    <TextView
        android:id="@android:id/empty"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/nowords"
        />

</LinearLayout>

edit: Here is the logcat if I activate openContextMenu:

04-17 11:31:06.103: D/dalvikvm(279): GC_FOR_MALLOC freed 5691 objects / 348744 bytes in 65ms
04-17 11:31:08.553: I/dalvikvm(279): threadid=1: stack overflow on call to Landroid/widget/AbsListView;.showContextMenuForChild:ZL
04-17 11:31:08.553: I/dalvikvm(279):   method requires 36+20+24=80 bytes, fp is 0x42089340 (64 left)
04-17 11:31:08.564: I/dalvikvm(279):   expanding stack end (0x42089300 to 0x42089000)
04-17 11:31:08.564: I/dalvikvm(279): Shrank stack (to 0x42089300, curFrame is 0x4208beb8)
04-17 11:31:08.573: D/AndroidRuntime(279): Shutting down VM
04-17 11:31:08.573: W/dalvikvm(279): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
04-17 11:31:08.703: D/dalvikvm(279): GC_FOR_MALLOC freed 7370 objects / 493888 bytes in 50ms
04-17 11:31:08.733: E/AndroidRuntime(279): FATAL EXCEPTION: main
04-17 11:31:08.733: E/AndroidRuntime(279): java.lang.StackOverflowError
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279):  at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279):  at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279):  at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279):  at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279):  at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279):  at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279):  at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279):  at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279):  at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279):  at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279):  at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279):  at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279):  at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279):  at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279):  at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279):  at android.widget.AbsListView.showC
04-17 11:31:08.823: D/dalvikvm(279): GC_FOR_MALLOC freed 3648 objects / 486736 bytes in 50ms

I changed the methods getWords and onCreateContextMenu and now it works:

private void getWords(Intent intent) {
    doc = (CLDocument)intent.getSerializableExtra(CL.DOC);
    item = doc.getEntries();

    ArrayAdapter<String> fileList = 
            new ArrayAdapter<String>(this, R.layout.row, item);
    setListAdapter(fileList);   

    registerForContextMenu(getListView());

//      getListView().setOnItemLongClickListener(new OnItemLongClickListener() {    
//          @Override
//          public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
//              registerForContextMenu(view);
//                      
//              return false;
//          }
//      });


}

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    AdapterView.AdapterContextMenuInfo info = 
            (AdapterView.AdapterContextMenuInfo)menuInfo;
    menu.setHeaderTitle(item.get(info.position));
    getMenuInflater().inflate(R.menu.context, menu);

}

So thanks to all who tried to help me!

Upvotes: 0

Views: 1513

Answers (2)

pskink
pskink

Reputation: 24720

You have to call registerForContextMenu with your ListView as a parameter in activity's onCreate() callback.

Upvotes: 1

mkderin
mkderin

Reputation: 21

Here: getListView().setOnItemLongClickListener(...) after long click you register for the context menu (registerForContextMenu(view)), so it will work only the next time. However if you want the context menu to work from the beginning, you should call this earlier, for example before that the registerForContextMenu(getListView()) method.

Upvotes: 0

Related Questions