Как удалить элемент из моего пользовательского базового адаптера? - PullRequest
8 голосов
/ 10 сентября 2011

Я расширяю BaseAdapter, чтобы создать настраиваемую строку списка.У меня есть контекстное меню, которое открывается каждый раз, когда пользователь удерживает строку, и запрашивает, хочет ли он удалить ее.Однако, как мне удалить строку?Хэш-карта - это только тестовые данные.

private MyListAdapter myListAdapter;
private ArrayList<HashMap<String, String>> items;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    items = new ArrayList<HashMap<String,String>>();
    HashMap<String, String> map1 = new HashMap<String, String>();
    map1.put("date", "10/09/2011");
    map1.put("distance", "309 km");
    map1.put("duration", "1t 45min");
    items.add(map1);

    myListAdapter = new MyListAdapter(this, items);
    setListAdapter(myListAdapter);
    getListView().setOnCreateContextMenuListener(this);
}


private class MyListAdapter extends BaseAdapter {

    private Context context;
    private ArrayList<HashMap<String, String>> items;

    public MyListAdapter(Context context, ArrayList<HashMap<String, String>> items) {
        this.context = context;
        this.items = items;
    }

    @Override
    public int getCount() {
        return items.size();
    }

    @Override
    public Object getItem(int position) {
        return items.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View view = convertView;

        if (view == null) {
            LayoutInflater layoutInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = layoutInflater.inflate(R.layout.row_log, null);
        }

        TextView rowLogOverview = (TextView) view.findViewById(R.id.rowLogOverview);

        HashMap<String, String> item = items.get(position);
        rowLogOverview.setText(item.get("date"));

        return view;
    }
}

Ответы [ 4 ]

16 голосов
/ 10 сентября 2011

Вы не удаляете из адаптера! Вы удаляете из предметов! и адаптер находится между вашими предметами и представлением. Из вида вы можете получить положение и в соответствии с положением вы можете удалить элементы. Тогда адаптер обновит вас.

Это означает, что вам нужно сделать что-то вроде этого

 items.remove(position);
adapter.notifyDataSetChanged()
11 голосов
/ 10 сентября 2011

Чтобы удалить, вам нужно сделать 2 вещи:

  1. Вызовите .remove() в вашем ArrayList (элементы).
  2. Позвоните .notifyDataSetChanged() в случае вашего MyListAdapter класса (mListAdapter).
1 голос
/ 10 сентября 2011
  1. удалить предмет из предметов
  2. звоните BaseAdapter.notifyDataSetChanged(). Затем список будет перерисован, а целевая строка будет удалена с экрана.
0 голосов
/ 19 июня 2018

Вы должны добавить прослушиватель на вашем адаптере для обработки события удаления.

public YourAdapter(Context context, List<T> rows, View.OnClickListener deleteListener) 
{ ... }

И на ваш метод getView () установите слушателя

yourBtn.setOnClickListener(this.deleteListener);

Вы можете добавить значение в тег btn для идентификации текущей строки:

yourBtn.setTag(position);

Наконец, в вашей активности ваш слушатель будет стрелять с текущей позицией в теге. Затем вы можете использовать предыдущий ответ для обновления вашего адаптера и обновления списка.

...