Android: как удалить элемент из listView и arrayAdapter - PullRequest
13 голосов
/ 15 января 2011

У меня есть коллекция элементов в ArrayList. Я добавляю их к клиентскому адаптеру следующим образом:

this.m_adapter = new MyAdapter(this, R.layout.myitem,
    itemCart.m_items);

У меня есть кнопка удаления для каждого из этих элементов в моем списке, но я не уверен, как связать кнопку onClick() для удаления с исходным элементом в ArrayList. Может кто-нибудь объяснить, как это сделать или указать мне учебник, где я могу прочитать об этом? Не саркастические / не снисходительные ответы очень приветствуются.

Ответы [ 9 ]

26 голосов
/ 15 января 2011

Вы можете вызвать метод remove() на вашем ArrayList

itemCart.m_items.remove(<index of element to remove>);
this.m_adapter.notifyDataSetChanged();

А затем вам нужно вызвать notifyDataSetChanged(); на вашем адаптере, чтобы обновить ListView

7 голосов
/ 29 июня 2012

Вы можете получить индекс элемента, просто заметив, что представление списка - это коллекция дочерних представлений (строк списка).

Вы можете сделать что-то подобное в своем коде:

(например, внутри метода getView ())

row.setOnLongClickListener(new OnLongClickListener() 
{
    @Override
    public boolean onLongClick(View view) {
        remove(listView.indexOfChild(view));
        return true;
    }
}

То есть, решение состоит в том, чтобы просто использовать метод indexOfChild (View), чтобы получить индекс дочернего представления, который нажал пользователь (long).

7 голосов
/ 15 января 2011

Вот мое решение до сих пор:

В методе getView() я делаю что-то вроде этого:

deleteButton.setTag(position);

Похоже, getTag() возвращает объект. Поэтому я сначала преобразовал позицию int в объект Integer. Похоже, работает.

В OnClickListener() я делаю следующее:

items.remove(index.intValue());

Пока все хорошо.

3 голосов
/ 28 января 2015

Следующие работы для меня:

/* Read values from resource into an array */
String[] strColorValues =  getResources().getStringArray(R.array.colors);

ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < strColorValues.length; i++) {
    list.add(strColorValues[i]);
}

ArrayAdapter adapterColors = new ArrayAdapter(getActivity(), android.R.layout.simple_spinner_item, list);

adapterColors.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

spinnerColors.setAdapter(adapterPermissionLevels);
spinnerColors.setOnItemSelectedListener(this);

/* Remove first element from the adapter and notify dataset changed. */
String item = spinnerColors.getItemAtPosition(0).toString();
adapterColors.remove(item);
adapterColors.notifyDataSetChanged();
1 голос
/ 15 января 2017

Удалить по позиции:

mainAdapter.remove(mainAdapter.getItem(position));

Например, последний:

mainAdapter.remove(mainAdapter.getItem(mainAdapter.getCount() - 1));
1 голос
/ 19 февраля 2013

Вот мой код.

  transfer.setItemPosition(position, items.get(position).getAddMode());

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

  public View getView(final int position, View convertView, ViewGroup parent) {
            View v = convertView;
          if (v == null) {
              final Context context = getContext();
                    LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    v = vi.inflate(R.layout.listviewitem_layout, null);
          }

          ItemEntry item = items.get(position);
          if (item != null) {
                    TextView textViewName = (TextView) v.findViewById(R.id.textViewItemName);
                    ImageView imageViewDelete = (ImageView) v.findViewById(R.id.imageViewDeleteIcon);

                    imageViewDelete.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View v) {                   
                                transfer.showDialog(4);                             
                                transfer.setItemPosition(position, items.get(position).getAddMode());
                        }
                  });

          if (textViewName != null) {
                    textViewName.setText(item.getItemName());
          }

          if(imageViewDelete != null) {
              imageViewDelete.setImageResource(R.drawable.delete);
          }
      }
      return v;
        }
}
0 голосов
/ 09 декабря 2018

Попробуйте эти коды строк, это было очень полезно для меня

holder.image.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            list.remove(position);
            notifyItemRemoved(position);
            notifyItemRangeChanged(position, list.size());
        }
    });
0 голосов
/ 06 ноября 2015

Кажется, что вы можете получить индекс (или позицию) нажатого элемента в ListView следующим образом:

listview.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        listview.remove(listview.getItem(position).toString());
    }
}

Таким образом, вам нужно прослушивать щелчки в представлениях, а затем извлекать индекс из этого.

0 голосов
/ 24 июня 2011

Если вы используете контекстное меню, вы можете получить AdapterContextMenuInfo, и эта структура дает индекс и идентификатор выбранного элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...