Deleting items from a ListView using a custom BaseAdapter

后端 未结 3 1574
日久生厌
日久生厌 2021-02-06 05:17

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

相关标签:
3条回答
  • 2021-02-06 05:43

    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:

    public void onClick(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 deleted
        for(int i=pos+1; i<getCount(); i++){
            currentHolder = mHolders.get(i);
            currentHolder.position = i-1;
        }
        mLanguages.remove(pos);
        notifyDataSetChanged();
    }
    

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

    0 讨论(0)
  • 2021-02-06 05:47

    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(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.language_link_row, null);
            holder = new ViewHolder();
            holder.lang = (TextView)convertView.findViewById(R.id.language_link_text);
    
            final ImageView deleteButton = (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;
    }
    
    0 讨论(0)
  • 2021-02-06 06:04

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

    0 讨论(0)
提交回复
热议问题