Как удалить элемент из пользовательского базового адаптера?

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

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 ответов


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

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

 items.remove(position);
adapter.notifyDataSetChanged()

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

  1. вызов .remove() на вашем ArrayList (элементы).
  2. вызов .notifyDataSetChanged() на экземпляр MyListAdapter класса (mListAdapter).

  1. удалить элемент из элементов
  2. вызов BaseAdapter.notifyDataSetChanged(). Затем listview будет перерисован и целевая строка будет удалена с экрана.

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

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

и в вашем методе getView () установите прослушиватель

yourBtn.setOnClickListener(this.deleteListener);

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

yourBtn.setTag(position);

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