Как да предавам променливи при продължително натискане на 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);
}

Работи добре... Но това, което искам да направя, е да получа текст и идентификатор на базата данни на избрания елемент.

Така че вместо „Любими“ бих искал да напиша Любим: Артикул1.

Ако някой може да помогне ще съм му благодарен.

Ето код за моя адаптер... Всъщност използвах адаптера от примера.

    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, което получавате, съдържа информация за това кой елемент от списъка е кликнат. Вероятно можете да използвате това, за да получите информацията, от която се нуждаете.

Актуализация:

Донякъде като 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));
person rogerkk    schedule 24.03.2011
comment
Както се вижда по-горе, ContextMenu.ContextMenuInfo menuInfo. Да, изгледът ми на списък се попълва с помощта на персонализиран ArrayAdapter. В момента се попълва само с икона и име. Ще бъда благодарен, ако можете да ми кажете как да измъкна да кажем име от него. Благодаря. Ако имате нужда от допълнителни данни, ще ги предоставя. - person M.V.; 25.03.2011
comment
Актуализира отговора. Ако все още не разбирате напълно как да съберете това, мисля, че трябва да видим повече от вашия изходен код, за да можем да направим полезен пример. Дефиниция на вашия адаптер за масив, дефиниция на елементите, които поставяте в него, съответните части от вашата дейност, където се използват и т.н. - person rogerkk; 25.03.2011
comment
Здравейте, имам въпрос за актуализиране (основен въпрос) с код на моя артикул и моя адаптер за артикул. Доколкото разбрах, трябва да направя в класа на моя артикул функция за съхраняване на позиция в listview и id? Вярно ли е? Какво е най-доброто решение за това? - person M.V.; 25.03.2011
comment
Изглежда, че не се нуждаете от нищо повече във вашия артикул. Получавате позицията на адаптера за масив от елементи от menuInfo (както е показано), след което продължавате да използвате ArrayAdapter.getItem(), за да извлечете действителния елемент от адаптера. - person rogerkk; 25.03.2011
comment
О, и актуализирах леко примерите според новата ви информация. - person rogerkk; 25.03.2011
comment
Опитвал съм запознат преди (Опитах и ​​този) и винаги получавам id 2 (променлива REMOVE_TODO)... Не мога да намеря решението... Актуализирах въпроса с всички важни данни... - person M.V.; 25.03.2011
comment
Не разбирам съвсем. Къде винаги получаваш 2? От todoItem.getId()? Какво ще кажете за променливата REMOVE_TODO? - person rogerkk; 25.03.2011
comment
Хех.. намерих грешка, коригирах я и сега работи - получавам правилната позиция (което е готино) :) Но въпросът ми сега е как да получа DB ID от позиция? - person M.V.; 25.03.2011
comment
Ако не ви разбирам погрешно, това се прави във втората част на моя пример. Вие 1) използвате позицията, за да извлечете задачата си от вашия arrayadapter и 2) Тъй като вашата задача изглежда вече съдържа вашия DB ID, можете просто да извикате getId() на задачата? - person rogerkk; 25.03.2011
comment
Страхотен! Пропуснах това съжалявам! Сякаш тотално се обърках! Благодаря, че ме изведе! :) - person M.V.; 25.03.2011
comment
Хехе, познавам чувството. Късмет! - person rogerkk; 25.03.2011

Ако адаптерът ви поддържа получаване на идентификатор, трябва да изглежда така:

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