简体   繁体   中英

How do I delete an item from my custom base adapter?

I am extending BaseAdapter to make a custom listview row. I have context menu that opens everytime a user holds on the row and prompts if he wants to delete it. However how do I remove the row? The hashmap is only test data.

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;
    }
}

You do not delete from the adapter ! You delete from the items ! and the adapter is between your items and the view. From the view you can get the position and according the position you can delete items. Then the adapter will refresh you views.

That means you need to do something like this

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

To delete, you'll need to do 2 things:

  1. Call .remove() on your ArrayList (items).
  2. Call .notifyDataSetChanged() on the instance of your MyListAdapter class ( mListAdapter ).
  1. remove item from items
  2. call BaseAdapter.notifyDataSetChanged() . Then listview will be redrawn and target row will be removed from screen.

You should add a Listener on your adapter to handle the delete event.

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

And on your getView() method set the listener

yourBtn.setOnClickListener(this.deleteListener);

You can add a value on the btn tag to identifiy the current row :

yourBtn.setTag(position);

Finally, on your Activity, your listener will fire with the current position in tag. You can then use the previous answer to update your adapter and refresh your listview.

In your BaseAdapter, add the code:

public View getView(final int position, View convertView, ViewGroup parent) {
    View v = convertView;

    LayoutInflater layoutInflater = LayoutInflater.from(this.context);
    v = layoutInflater.inflate(R.layout.items, null);

    TextView buttonDelete = (TextView) v.findViewById(R.id.buttonDelete);
    buttonDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            item.remove(position);
            notifyDataSetChanged();
        }
    });
    return v;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM