Skip to content Skip to sidebar Skip to footer

Deleting Items From A Listview Using A Custom Baseadapter

I am using a customised BaseAdapter to display items on a ListView. The items are just strings held in an ArrayList. The list items have a delete button on them (big red X), and I'

Solution 1:

You have to set the position each time. Your implementation only sets the position on the creation of the view. However when the view is recycled (when convertView is not null), the position will not be set to the correct value.

public View getView(finalint position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.language_link_row, null);
        holder = newViewHolder();
        holder.lang = (TextView)convertView.findViewById(R.id.language_link_text);

        finalImageViewdeleteButton= (ImageView) 
                convertView.findViewById(R.id.language_link_cross_delete);
        deleteButton.setOnClickListener(this);

        convertView.setTag(holder);
        deleteButton.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.lang.setText(mLanguages.get(position));
    holder.position = position;
    return convertView;
}

Solution 2:

you need to implement OnItemClickListener interface, and delete the item in the onItemClick method, one parameter of the method is the position.

Solution 3:

My final solution was to use the accepted answer by Greg and the following:

  • Store the holders in a HashMap, with the item positions as the keys (this is initialised as empty in the constructor)

    private HashMap mHolders;

  • Use this as the onClickListener method:

publicvoidonClick(View v) {
    ViewHolder deleteHolder = (ViewHolder) v.getTag();
    int pos = deleteHolder.position;
    mHolders.remove(pos);

    ViewHolder currentHolder;

    // Shift 'position' of remaining languages // down since 'pos' was deletedfor(int i=pos+1; i<getCount(); i++){
        currentHolder = mHolders.get(i);
        currentHolder.position = i-1;
    }
    mLanguages.remove(pos);
    notifyDataSetChanged();
}
Copy

[Please excuse the weird formatting. The code embedding isn't working properly]

Post a Comment for "Deleting Items From A Listview Using A Custom Baseadapter"