Android 如何在长按ListView时传递变量?

Android 如何在长按ListView时传递变量?,android,listview,variables,contextmenu,Android,Listview,Variables,Contextmenu,我会有listview和里面的很多项目。我希望用户可以长按该项并将其设置为收藏夹。要做到这一点,我需要长按此菜单的DB id 我有以下代码 @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCr

我会有listview和里面的很多项目。我希望用户可以长按该项并将其设置为收藏夹。要做到这一点,我需要长按此菜单的DB id

我有以下代码

@Override
public void onCreateContextMenu(ContextMenu menu, 
                              View v, 
                              ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);

menu.setHeaderTitle("Favorite");
menu.add(0, REMOVE_TODO, Menu.NONE, R.string.favorit_add);
}
它工作得很好。。。但我想做的是获取所选项目的文本和数据库id

因此,除了“最爱”,我想写最爱:Item1

如果有人能帮忙,我将不胜感激

下面是我的适配器的代码。。。我实际上使用了示例的适配器

    package com.TVSpored;

import android.content.Context;
import java.util.*;
import android.view.*;
import android.widget.*;

public class ToDoItemAdapter extends ArrayAdapter<ToDoItem> {

  int resource;

  public ToDoItemAdapter(Context _context, 
                             int _resource, 
                             List<ToDoItem> _items) {
    super(_context, _resource, _items);
    resource = _resource;
  }

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

    ToDoItem item = getItem(position);

    String taskString = item.getTask();
    String icon_name = item.getCreated();
    int fav = item.getFavorite();

    if (convertView == null) {
      todoView = new LinearLayout(getContext());
      String inflater = Context.LAYOUT_INFLATER_SERVICE;
      LayoutInflater vi = (LayoutInflater)getContext().getSystemService(inflater); 
      vi.inflate(resource, todoView, true);
    } else {
      todoView = (LinearLayout) convertView;
    }

    ImageView favView = (ImageView)todoView.findViewById(R.id.rowImgFav);
    ImageView channelView = (ImageView)todoView.findViewById(R.id.rowImg);
    TextView channelName = (TextView)todoView.findViewById(R.id.row);

    //dateView.setText(dateString);

    channelView.setImageResource(getContext().getResources().getIdentifier("com.TVSpored:drawable/channels_"+icon_name , null, null));

    channelName.setText(taskString);

    if(fav == 0)
    {
        favView.setImageResource(R.drawable.sys_srcek_disabled);
    }
    else
    {
        favView.setImageResource(R.drawable.sys_srcek);
    }
    return todoView;
  }
  }
下面是主活动类中的代码

 @Override
 public void onCreateContextMenu(ContextMenu menu, 
                              View v, 
                              ContextMenu.ContextMenuInfo menuInfo) {
 super.onCreateContextMenu(menu, v, menuInfo);


 menu.setHeaderTitle("Urejanje kanala");
 menu.add(0, REMOVE_TODO, Menu.NONE, R.string.favorit_add); 
 // static final private int REMOVE_TODO = Menu.FIRST + 1; // defined ad the begining
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
 super.onOptionsItemSelected(item);

 AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item.getMenuInfo();
 int arrayAdapterPosition = menuInfo.position;

 ToDoItem todoItem = (ToDoItem)aa.getItem(arrayAdapterPosition);
 String task = todoItem.getTask();
 int id = todoItem.getID();

 int index = myListView.getSelectedItemPosition();
 aa.getItemId(index);

 changeFavorite(id);
 return true;
 }
下面是updateArray函数(在更改时调用)

还有一个填充函数

private void populateTChannels() {
// Get all the todo list items from the database.
toDoListCursor = toDoDBAdapter. getAllToDoItemsCursor();
if((toDoListCursor.getCount() == 0) || !toDoListCursor.moveToFirst())
{
    toDoDBAdapter.populateDB();
}

if(toDoDBAdapter.ChannelsArray.length > toDoListCursor.getCount())
{
    toDoDBAdapter.populateDBWhitCheck();
}
toDoListCursor = toDoDBAdapter. getAllToDoItemsCursor();
startManagingCursor(toDoListCursor);

// Update the array.
updateArray();
}

传递的
ContextMenu.ContextMenuInfo
包含有关单击列表中哪个项目的信息。你可以用它来获取你需要的信息

更新:

有点像dziobas在回答中提到的,您可以这样做,以了解所选项目在适配器中的位置:

AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item.getMenuInfo();
long arrayAdapterPosition = menuInfo.position;
现在您知道了位置,可以从
ArrayAdapter
获取它。如果将此
ArrayAdapter
实例存储在成员变量中(在本例中,我将其命名为myArrayAdapter),则可以使用
ArrayAdapter.getItem(int位置)
继续获取项:

现在,您可以继续设置菜单标题,如下所示:

menu.setHeaderTitle("Favorite: " + task + Integer.toString(id));

如果您的适配器支持获取Id,则应如下所示:

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item.getMenuInfo();
    long id = menuInfo.id;
    ...

如上所示,ContextMenu.ContextMenuInfo menuInfo。是,我的listview是使用自定义ArrayAdapter填充的。目前,它仅由图标和名称填充。如果您能告诉我如何从中获取信息,我将不胜感激。谢谢如果你需要任何额外的数据,我会提供。更新答案。如果您仍然不太了解如何将其组合在一起,我认为我们需要更多地了解您的源代码,以便能够制作一个有用的示例。数组适配器的定义、放入其中的项的定义、活动中使用它们的相关部分等。您好,我有一个更新问题(主要问题),其中包含我的项和我的项适配器的代码。据我所知,我必须在我的项的类中创建一个函数来存储listview中的位置和id?对吗?这样做的最佳解决方案是什么?您似乎不需要在您的物品中添加更多内容。您可以从menuInfo(如图所示)获取items数组适配器位置,然后继续使用
ArrayAdapter.getItem()
从适配器检索实际的项。哦,我根据您的新信息稍微更新了示例。
ToDoItem todoItem = (ToDoItem)myArrayAdapter.getItem(arrayAdapterPosition);
String task = todoItem.getTask();
int id = todoItem.getId();
menu.setHeaderTitle("Favorite: " + task + Integer.toString(id));
@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item.getMenuInfo();
    long id = menuInfo.id;
    ...