Как передать переменные при длительном нажатии на ListView?

У меня был бы список и много элементов внутри. Я хочу, чтобы пользователь мог долго нажимать на элемент и устанавливать его как Избранное. Для этого мне нужно получить идентификатор БД в это меню при длительном нажатии.

У меня есть следующий код

@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);
}

Он отлично работает... Но я хочу получить текст и идентификатор базы данных выбранного элемента.

Итак, вместо «Избранное» я хотел бы написать Избранное: 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;
  }
  }

И далее мой товар

package com.TVSpored;

import java.text.SimpleDateFormat;

public class ToDoItem {

  String task;
  String created;
  Integer fav;
  Integer id;

  public String getTask() {
    return task;
  }

  public String getCreated() {
    return created;    
  }

  public Integer getFavorite()
  {
      return fav;
  }

  public Integer getID()
  {
      return id;
  }

  public ToDoItem(String _task, String _created, int _fav, int _id) {
    task = _task;
    created = _created;
    fav = _fav;
    id = _id;
  }

  }

Вот код в основном классе активности

 @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 updateArray() {
  toDoListCursor.requery();

  todoItems.clear();
  int j = 0;
  if (toDoListCursor.moveToFirst())
    do 
    { 
      String task =            toDoListCursor.getString(toDoListCursor.getColumnIndex(ToDoDBAdapter.KEY_NAME));
      String created = toDoListCursor.getString(toDoListCursor.getColumnIndex(ToDoDBAdapter.KEY_EPG_NAME));
      int fav = toDoListCursor.getInt(toDoListCursor.getColumnIndex(ToDoDBAdapter.KEY_EPG_NAME));
      int id = toDoListCursor.getInt(toDoListCursor.getColumnIndex(ToDoDBAdapter.KEY_ID));

      ToDoItem newItem = new ToDoItem(task, created, fav, id);
      todoItems.add(0, newItem);
      j++;
    } 
    while(toDoListCursor.moveToNext());

  aa.notifyDataSetChanged();
}

и функция заполнения...

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();
}

person M.V.    schedule 24.03.2011    source источник


Ответы (2)


Полученный вами ContextMenu.ContextMenuInfo содержит информацию о том, какой элемент в списке был нажат. Вы, вероятно, можете использовать это, чтобы получить необходимую информацию.

Обновление:

Как упоминает дзиобас в своем ответе, вы можете сделать что-то вроде этого, чтобы узнать, какую позицию занимает выбранный элемент в вашем адаптере:

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

Теперь вы знаете позицию и можете получить ее из своего ArrayAdapter. Если у вас есть этот экземпляр ArrayAdapter, сохраненный в переменной-члене (в этом примере я назвал его myArrayAdapter), вы можете перейти к получению элемента с ArrayAdapter.getItem(int position):

ToDoItem todoItem = (ToDoItem)myArrayAdapter.getItem(arrayAdapterPosition);
String task = todoItem.getTask();
int id = todoItem.getId();

Теперь вы можете приступить к установке заголовка меню следующим образом:

menu.setHeaderTitle("Favorite: " + task + Integer.toString(id));
person rogerkk    schedule 24.03.2011
comment
Как видно выше, ContextMenu.ContextMenuInfo menuInfo. Да, мой список заполняется с помощью пользовательского ArrayAdapter. В настоящее время он заполняется только значком и именем. Был бы признателен, если бы вы могли сказать мне, как получить, скажем, имя из этого. Спасибо. В случае, если вам нужны какие-либо дополнительные данные, я предоставлю их. - person M.V.; 25.03.2011
comment
Обновил ответ. Если вы все еще не совсем понимаете, как это собрать, я думаю, нам нужно увидеть больше вашего исходного кода, чтобы иметь возможность сделать полезный пример. Определение вашего адаптера массива, определение элементов, которые вы в него помещаете, соответствующие части вашей деятельности, где они используются, и т. д. - person rogerkk; 25.03.2011
comment
Привет, у меня есть вопрос об обновлении (основной вопрос) с кодом моего предмета и моего адаптера предмета. Насколько я понял, я должен сделать в своем классе элемента функцию для хранения позиции в списке и идентификаторе? Это правильно? Какое лучшее решение для этого? - person M.V.; 25.03.2011
comment
Кажется, вам больше ничего не нужно внутри вашего предмета. Вы получаете позицию адаптера массива элементов из menuInfo (как показано), затем вы продолжаете использовать ArrayAdapter.getItem() для извлечения фактического элемента из адаптера. - person rogerkk; 25.03.2011
comment
О, и я немного обновил примеры, в соответствии с вашей новой информацией. - person rogerkk; 25.03.2011
comment
Раньше я пробовал знакомый (пробовал и этот), и я всегда получаю идентификатор 2 (переменная REMOVE_TODO)... Я не могу найти решение... Я обновил вопрос со всеми важными данными... - person M.V.; 25.03.2011
comment
Я не совсем понимаю. Где ты всегда берешь 2? Из todoItem.getId()? Как насчет переменной REMOVE_TODO? - person rogerkk; 25.03.2011
comment
Хех... нашел ошибку, исправил ее, и теперь она работает - я получаю правильную позицию (что круто) :) Но мой вопрос теперь в том, как получить идентификатор БД из позиции? - person M.V.; 25.03.2011
comment
Если я вас правильно понимаю, это то, что делается во второй части моего примера. Вы 1) используете позицию для извлечения своей задачи из адаптера массива и 2) поскольку ваша задача, похоже, уже содержит ваш идентификатор БД, вы можете просто вызвать getId() для задачи? - person rogerkk; 25.03.2011
comment
Большой! Пропустил это, извините! Я совсем запутался! Спасибо, что вытащили меня! :) - person M.V.; 25.03.2011
comment
Хе-хе, я знаю это чувство. Удачи! - person rogerkk; 25.03.2011

Если ваш адаптер поддерживает получение Id, то это должно выглядеть так:

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