2013-10-03 22 views
1

我正在研究一个具有冰淇淋风味列表的项目。当你长时间点击一种风味时,你会看到一个带有一些选项的上下文菜单:图片,配料,价格等。如果长时间点击巧克力并选择图片,您应该看到巧克力冰淇淋的照片......如果您对香草做了同样的事情,您会看到香草冰淇淋。如何从contextMenu访问ListItem位置

这是问题所在。您在上下文菜单中进行的选择与您长按的原始味道有关。我需要能够访问flavor数组中的flavor的位置。 - 在OnListItemClicked()方法中,我的flavor数组的位置是可访问的,但是... OnContextItemSelect()方法只知道它自己的选择项(图片,成分,价格)。

你可以看到我创造了一个listPosition变量,但我意识到,如果被点击风味迅速使用OnListItemClicked(),而不是长期使用点击OnContextItemSelect()这只会工作。

ApplyMenuChoice()是可以找到问题代码的地方。

我会寻求帮助非常感激, 谢谢:)

MenuDemo.java

public class MenuDemo extends ListActivity { 

    TextView selection; 
    TextView displayText; 
    String[] flavorItems; 
    String[] colors; 
    ImageView myImage; 
    int currentMenu; 
    int listPosition = 0; 

    int[] ItemImageSource = {R.drawable.vanilla,R.drawable.chocolate,R.drawable.strawberry}; 

    private final String TAG = "Main Activity"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     selection=(TextView)findViewById(R.id.selection); 
     displayText=(TextView)findViewById(R.id.displayText); 
     myImage=(ImageView)findViewById(R.id.myImage); 
     flavorItems = getResources().getStringArray(R.array.flavors); 
     colors = getResources().getStringArray(R.array.colors); 



     setListAdapter(new ArrayAdapter<String>(this, R.layout.flavor_menu_style, flavorItems)); 
     registerForContextMenu(getListView()); 
     displayText.setText("Welcome! Click and hold flavor to learn more about it."); 
    } 

    public void onListItemClick(ListView parent, View v,int position, long id) 
    { 

     if (currentMenu == 1){selection.setText(colors[position]);} 
     else {selection.setText(flavorItems[position]);} 

     String strI = Integer.toString(position); 
     displayText.setText("teeesst" + strI); 

     listPosition = position; 
     Log.i(TAG,"!!!!!!!!!!!!!!"); 
    } 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View v,ContextMenu.ContextMenuInfo menuInfo) 
    { 
     super.onCreateContextMenu(menu, v, menuInfo); 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.activity_menu_demo, menu); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) 
    {  
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.activity_new, menu); 


     return true;  
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { //item is the menu item chosen 

     boolean ret = applyOptionMenuChoice(item); 
     if (ret == false) 
      ret = super.onOptionsItemSelected(item); 

     return ret; 

    } 


    @Override 
    public boolean onContextItemSelected(MenuItem item) 
    { 
     boolean ret = applyMenuChoice(item); 
     if (ret == false) 
      ret = super.onContextItemSelected(item); 

     return ret; 
    } 


    private boolean applyMenuChoice(MenuItem item) { 
     switch (item.getItemId()) 
     { 
     case R.id.picture: 

     //this would work if listPosition was linked to the flavors array position 
      myImage.setImageResource(ItemImageSource[listPosition]); 

      return(true); 

     case R.id.ingredients: 

      String [] ingredients; 
      ingredients = new String [3]; 

      ingredients[0] = "VANILLA -- these are the ingredients VANILLA"; 
      ingredients[1] = "CHOCOLATE -- these are the ingredients"; 
      ingredients[2] = "STRAWBERRY -- these are the ingredients"; 

      displayText.setText(ingredients[listPosition]); 

      return(true); 

     case R.id.order: 
      //I will add stuff here later 
      return(true); 

     case R.id.price: 
      //I will add stuff here later 
      return(true); 



     } 

     return(false); 

    } 

    private boolean applyOptionMenuChoice(MenuItem item) { 
     switch (item.getItemId()) 
     { 
     case R.id.color_menu: 
      setListAdapter(new ArrayAdapter<String>(this, R.layout.color_menu_style, colors)); 
      currentMenu = 1; 
      return(true); 

     case R.id.flavor_menu: 

      setListAdapter(new ArrayAdapter<String>(this, R.layout.flavor_menu_style, flavorItems)); 
      currentMenu = 2; 
      return(true); 

     } 

     return(false); 

    } 


} 

回答

2

你可以通过MenuItem

@Override 
    public boolean onContextItemSelected(MenuItem item) { 
     AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
     int listPosition = info.position; 
     //pass this to your applyMenuChoice method. ice cream nom nom nom 
    } 
你长按列表项的位置
+0

Awsome!这只是一个小修改。我真的很感谢你的帮助,我很清楚android编程,而这本来很难发现。 只是为了防止其他人看到这个例子,唯一的变化是我们正在查看的方法是onContextItemSelected(MenuItem项)而不是onOptionsItemSelected(MenuItem项)。 – ThisBetterWork

+0

@ThisBetterWork - 哎呀。修正了:) – dymmeh