Android 如何在长按ListView时传递变量?
我会有listview和里面的很多项目。我希望用户可以长按该项并将其设置为收藏夹。要做到这一点,我需要长按此菜单的DB id 我有以下代码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
@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;
...