2010-12-04 12 views
5

Liste etkinliğim var ve "yeni öğe ekle ..." olan ilk öğeyi el ile eklemeyi seçtim.ListActivity'de hangi öğeye uzun basıldığına bağlı olarak belirli bir bağlam menüsü nasıl ayarlanır?

registerForContextMenu(getListView());onCreate ürününe tüm liste görünümü için içerik menüsünü kaydettim. içerik menüsü inşa olduğunda

, sistem onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) çağırır. View v listView'dür ve liste görünümünde hangi öğenin uzun basıldığını bilmek için bir yol bulamıyorum.

"Yeni öğe ekle ..." için bir düzen içeren bir xml düzeni oluşturabilir ve ardından etkinlik tarafından doldurulacak ve içerik menüsüne tepki veren bir liste görünümü ekleyebilirim. Bu sorunu herhangi bir xml düzeni olmadan çözmenin bir yolu olduğundan emin olun.

Liste görünümümün içinde yer alan her görüntüyü registerForContextMenu kullanarak kaydetmeye çalıştım, ancak bu liste görünümü artık dokunmaya yanıt vermiyor. Okumak için

public class AMain extends ListActivity { 
    private List<String> pregList; 
    private List<Long> pregIds; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     pregList = new ArrayList<String>(); 
     pregIds = new ArrayList<Long>(); 

     registerForContextMenu(getListView()); 
    } 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
     super.onCreateContextMenu(menu, v, menuInfo); 
     // TODO: hide the menu for the 1st item!! 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.context_menu, menu); 
    } 

    @Override 
    public boolean onContextItemSelected(MenuItem item) { 
     AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
     Logger.d("id = "+info.id); 
     switch (item.getItemId()) { 
     case R.id.menu_show: 
      showPregnancy((int) info.id); 
      return true; 

     case R.id.menu_edit: 
      editPregnancy((int) info.id); 
      return true; 

     case R.id.menu_delete: 
      //TODO: do the deletion 
      return true; 

     default: 
      return super.onContextItemSelected(item); 
     } 
    } 

    protected void onStart() { 
     super.onStart(); 

     clearPregList(); 
     loadPregList(); 
     getListView().setAdapter(new PregnancyListAdapter(this)); 
    } 

    void clearPregList() { 
     pregList.clear(); 
     pregIds.clear(); 
    } 

    void loadPregList() { 
     PregnanciesDbAdapter db = new PregnanciesDbAdapter(this); 
     db.open(); 
     Cursor c = db.getPregnancies(); 

     if (c != null) { 
      do { 
       pregList.add(c.getString(c.getColumnIndex(PregnanciesDbAdapter.KEY_PREG_NOM))); 
       pregIds.add(c.getLong(c.getColumnIndex(PregnanciesDbAdapter.KEY_PREG_ROWID))); 
      } while (c.moveToNext()); 
      c.close(); 
     } 

     db.close(); 
    } 

    private class PregnancyListAdapter extends BaseAdapter { 
     private Context context; 

     public PregnancyListAdapter(Context ctx) { 
      context = ctx; 
     } 

     @Override 
     public int getCount() { 
      return pregList.size()+1; 
     } 

     @Override 
     public Object getItem(int position) { 
      if (position == 0) { // add button 
       return getString(R.string.addPreg); 
      } else { 
       return pregList.get(position-1); 
      } 
     } 

     @Override 
     public long getItemId(int position) { 
      if (position == 0) { 
       return -1; 
      } 
      return pregIds.get(position-1); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      LinearLayout itemLayout; 

      itemLayout= (LinearLayout) LayoutInflater.from(context).inflate(R.layout.homelist_item_pregnancy, parent, false); 

      ImageView logo = (ImageView) itemLayout.findViewById(R.id.logo); 
      TextView pregName = (TextView) itemLayout.findViewById(R.id.pregName); 

      if (position == 0) { 
       itemLayout.setFocusable(false); 
       itemLayout.setFocusableInTouchMode(false); 
       pregName.setText(getString(R.string.addPreg)); 
      } else { 
       logo.setVisibility(View.INVISIBLE); 
       pregName.setText(pregList.get(position-1)); 
      } 

      itemLayout.setId(position); 

      return itemLayout; 
     } 
    } 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 
     if (position == 0) { 
      startActivity(prepareIntent(AShowPregnancy.class, 0)); 
     } else { 
      showPregnancy(position-1); 
     } 
    } 

    void showPregnancy(int pregId) { 
     startActivity(prepareIntent(AShowPregnancy.class, pregId)); 
    } 

    void editPregnancy(int pregId) { 
     startActivity(prepareIntent(ANewPregnancy.class, pregId)); 
    } 

    Intent prepareIntent(Class<?> className, int pregId) { 
     Intent i = new Intent(this, className); 

     if (pregId > 0) { 
      PregnanciesDbAdapter db = new PregnanciesDbAdapter(this); 
      db.open(); 
      Pregnancy p = db.load(pregIds.get(pregId)); 
      db.close(); 
      i.putExtra(C.EXTRA_PREGNANCY, p); 
     } 

     return i; 
    } 
} 

Teşekkür:

İşte benim etkinlik kod listesidir. Umarım yardım edebilirsin.

cevap

4

Oh, tanrım, yine. Nasıl yapılacağını kendim öğrendim ve daha kolaydı.

AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo; 
// info.position is the position in the ListView 

kendimden nefret :)

+0

ben bu anlatacağım edildi. İyi, kendini keşfettim. :) – Varun

+0

Kutsal inek, çok teşekkür ederim. Aynı sorunu yaşıyordum ve menü nesnelerinin ne olduğunu merak ediyordum, çünkü her zamanki nesne yöntemlerinden başka bir şekilde erişilemez bir şeyleri varmış gibi görünüyordu. –