2010-05-18 4 views
5

Menu kontekstowe nie pojawia się po długim kliknięciu pozycji listy w widoku listy. Rozszerzyłem adapter bazowy i wykorzystałem uchwyt widoku do zaimplementowania niestandardowej listy z widokami tekstu i przyciskiem obrazu.Menu kontekstowe nie jest wyświetlane na długim kliknięciu.

adapter = new MyClickableListAdapter(this, R.layout.timeline, mObjectList); 
     list.setAdapter(adapter); 
     registerForContextMenu(list); 

Realizacja onCreateContextMenu

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, 
    ContextMenuInfo menuInfo) { 
    // TODO Auto-generated method stub 
    super.onCreateContextMenu(menu, v, menuInfo); 

    Log.d(TAG, "Entering Context Menu"); 

    menu.setHeaderTitle("Context Menu"); 

    menu.add(Menu.NONE, DELETE_ID, Menu.NONE, "Delete") 
    .setIcon(R.drawable.icon); 
} 

XML dla ListView jest tutaj

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

Próbowałem to przez wiele dni. Myślę, że nie można zarejestrować menu kontekstowego dla niestandardowego widoku listy w ten sposób. Popraw mnie, jeśli się mylę (prawdopodobnie z przykładowym kodem).

Teraz myślę o dodaniu przycisku do elementu listy i wyświetla menu po kliknięciu. Czy jest to możliwe w inny sposób niż w przypadku Dialogów?

Każda pomoc będzie mile widziane ..

Odpowiedz

5

Dlaczego nie użyłeś ListActivity?

W moim ListActivity mam:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    /* setContentView() and all stuff that happens in this method */ 
    registerForContextMenu(getListView()); 
} 

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, 
     ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 
    AdapterView.AdapterContextMenuInfo info; 
    try { 
     info = (AdapterView.AdapterContextMenuInfo) menuInfo; 
    } catch (ClassCastException e) { 
     Log.e(TAG, "bad menuInfo", e); 
    return; 
    } 

    Something something = (Subway) getListAdapter().getItem(info.position); 
    menu.setHeaderTitle(something.getName()); 
    menu.setHeaderIcon(something.getIcon()); 
    menu.add(0, CONTEXT_MENU_SHARE, 0, "Do something!"); 
} 

@Override 
public boolean onMenuItemSelected(int featureId, MenuItem item) { 
    AdapterView.AdapterContextMenuInfo info; 
    try { 
     info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); 
    } catch (ClassCastException e) { 
     Log.e(TAG, "bad menuInfo", e); 
     return false; 
    } 

    switch (item.getItemId()) { 
     case DO_SOMETHING: 
      /* Do sothing with the id */ 
      Something something = getListAdapter().getItem(info.position); 
      return true; 
    } 
+0

Dziękuję. Musisz spróbować tego kodu. – primpap

+0

@Macarse jest to do długiego naciśnięcia? – likejiujitsu

2

Zastosowanie OnItemLongClickListener (poprzez zestaw ~) Sposób ListView.

+0

Próbowałem używać OnItemLongClickListener na liście. Rozbiło się. – primpap

+0

@primal: To się zawiesiło z 'StackOverflowException' w prawo? – Macarse

+0

Nie. Inny błąd. Nie pamiętam, wiem. Zastąpiłem go długim kliknięciem w widok tekstowy i wyświetliłem okno dialogowe z buttonami. Służy temu celowi. – primpap

8

Taki problem pojawia się w widoku listy, gdy ma być aktywowana przedmiotów, takich jak pole wyboru, Radiobutton itp. Aby rozwiązać ten problem w layoucie dla pozycji listy dla elementów, które można ustawić, należy:

android:focusable="false";