2012-02-25 12 views
5

Come è possibile impostare il titolo del menu di scelta rapida dall'elemento Listview selezionato? Questa è la mia attività principale .Impostare il titolo del menu di scelta rapida dalla voce Listview selezionata

public class OListActivity extends ListActivity { 
...... 
...... 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     registerForContextMenu(getListView()); 
     ...... 
...... 
     MatrixCursor cursor; 
     cursor = NameManager.getnameList(); 
     startManagingCursor(cursor); 
     String[] from = { "name", "info", "status", BaseColumns._ID }; 
     int[] to = { R.id.name, R.id.info, R.id.status }; 
     SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
       R.layout.row, cursor, from, to); 
     setListAdapter(adapter); 
    } 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View v, 
      ContextMenuInfo menuInfo) { 
     super.onCreateContextMenu(menu, v, menuInfo); 
     menu.setHeaderTitle("Menu");// TODO Change to name of selected listview item. 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.context_menu, menu); 
    } 
..... 
..... 

ho bisogno di impostare menu.setHeaderTitle-R.id.name. Sono a conoscenza di un altro simulatore question ma non si parla di come gestire un complesso ListView con più visualizzazioni di testo.

risposta

13

utilizzare il parametro ContextMenuInfo dal metodo onCreateContextMenu():

@Override 
    public void onCreateContextMenu(ContextMenu menu, View v, 
      ContextMenuInfo menuInfo) { 
     super.onCreateContextMenu(menu, v, menuInfo); 
     AdapterView.AdapterContextMenuInfo info; 
     try { 
      // Casts the incoming data object into the type for AdapterView objects. 
      info = (AdapterView.AdapterContextMenuInfo) menuInfo; 
     } catch (ClassCastException e) { 
      // If the menu object can't be cast, logs an error. 
      Log.e(TAG, "bad menuInfo", e); 
      return; 
     } 
     Cursor cursor = (Cursor) getListAdapter().getItem(info.position); 
     if (cursor == null) { 
      // For some reason the requested item isn't available, do nothing 
      return; 
     } 

     // if your column name is "name" 
     menu.setHeaderTitle(cursor.getString(cursor.getColumnIndex("name"))); 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.context_menu, menu); 
    } 
+0

Ha funzionato, grazie mille. Tra l'altro ho dovuto passare a 'menu.setHeaderTitle (cursor.getString (1))'. –

+0

@BinoyBabu Hai ragione il metodo 'getString()' richiede un 'int' e non un' String'. Sono stanco e stavo pensando al metodo 'cursor.getString (cursor.getColumnIndex (" name "));'. – Luksprog

+0

Non preoccuparti. Comunque sei il mio eroe. Dormi un po 'bene? –

0

So che questo è piuttosto un vecchio post ed è la risposta corretta pure. Tuttavia, mentre sto usando questo oggi mi sono imbattuto in qualcosa che mi piacerebbe aggiungere.

Il parametro ContextMenuInfo viene utilizzato per trovare la posizione esatta dell'oggetto che ha avviato il menu contestuale i.e la nostra voce di adpater.

Quindi, può restituire un elemento di tipo definito nel metodo dell'adattatore getItem() utilizzando tale posizione info.position, come nel metodo sopra getItem() restituisce un oggettocursore.

(Nel mio caso è restituito una classe modello e poi ho capito che per impostare il titolo tramite menu.setHeaderTitle() posso passare i miei metodi che il mio modello supporta come model.getItamName())

Inoltre, ricorda se l'AdapterView contiene alcuna intestazione voi dovrà escluderli mentre recuperano la posizione usando menuInfo. Mi piace,

Cursor cursor = (Cursor) getListAdapter().getItem(info.position - yourList.getHeaderViewsCount()); 

Spero che questo aiuti qualcuno. :)

Problemi correlati