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

1

У меня было бы 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);
}

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

Итак, вставка "Любимый" Я бы хотел написать "Избранное": "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();
}
Теги:
variables
listview
contextmenu

2 ответа

2
Лучший ответ

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

Update:

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

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));
  • 0
    Как видно выше, ContextMenu.ContextMenuInfo menuInfo. Да, мой список заполнен с помощью специального ArrayAdapter. В настоящее время он заполняется только значком и именем. Был бы признателен, если бы вы могли сказать мне, как получить, скажем, имя из этого. Благодарю. Если вам понадобятся какие-либо дополнительные данные, я их предоставлю.
  • 0
    Обновил ответ. Если вы все еще не совсем понимаете, как все это составить, я думаю, что нам нужно увидеть больше вашего исходного кода, чтобы сделать полезный пример. Определение вашего адаптера массива, определение элементов, которые вы помещаете в него, соответствующие части вашей деятельности, где они используются и т. Д.
Показать ещё 9 комментариев
0

Если ваш адаптер поддерживает получение идентификатора, он должен выглядеть следующим образом:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню