删除一行附加了 AsyncTaskLoader 的 ListView

Remove a row of ListView attached with AsyncTaskLoader

我已经实现了 ListViewListFragment 并附有 AsyncTaskLoader。数据是从数据库中填充的。每行都有一个 PopUp 的菜单按钮,它还有 2 个选项(编辑和删除)。

我想要的是,当单击任何选项时,该对象将从数据库中删除。

如何获取已删除对象的id?

我的适配器:

public class ConferenceAdapter extends ArrayAdapter<Conference> implements View.OnClickListener, PopupMenu.OnMenuItemClickListener{
    private Context context;
    private final LayoutInflater mInflater;

    public ConferenceAdapter(Context context) {
        super(context, R.layout....);
        this.context = context;
        mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public void setData(List<Conference> data) {
        clear();
        if (data != null) {
            addAll(data);
        }
    }

    /**
     * Populate new items in the list.
     */
    @Override public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        Conference conference = (Conference)getItem(position);

        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.item_conference_fragment, parent, false);

            holder = new ViewHolder();
            ...
            holder.btnOverflow = (ImageButton)convertView.findViewById(R.id.btn_overflow);
            ...

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

        holder.btnOverflow.setOnClickListener(this);
        ...

        return convertView;
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_overflow) {
            PopupMenu pm = new PopupMenu(context, v);
            Menu menu = pm.getMenu();
            menu.add("Edit");
            menu.add("Delete");
            pm.show();

            pm.setOnMenuItemClickListener(this);
        }
    }

    @Override
    public boolean onMenuItemClick(MenuItem item) {
        OnPopUpListener listener = (OnPopUpListener)context;
        if (item.getTitle().equals("Delete")) {
        //  What logic should I use here?
        //  How can I get current Object as I do not have a list?
            listener.onDelete(...);
        }
        return false;
    }

    static class ViewHolder {
        ImageButton btnOverflow;
        ...
    }
}

有时,良好的编码习惯可能会导致困难局面。无论如何,我将事件侦听器移到了 getView(...) 内,并且我能够访问该对象。可能对以后的人有帮助。

     /**
     * Populate new items in the list.
     */
    @Override public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        final Conference conference = (Conference)getItem(position);

        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.item_conference_fragment, parent, false);

            holder = new ViewHolder();           
            holder.btnOverflow = (ImageButton)convertView.findViewById(R.id.btn_overflow);
            ...
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder)convertView.getTag();
        }

        final ViewHolder finalHolder = holder;
        holder.btnOverflow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finalHolder.btnOverflow.setTag(position);
                PopupMenu pm = new PopupMenu(context, v);
                Menu menu = pm.getMenu();
                menu.add("Edit");
                menu.add("Delete");
                pm.show();

                pm.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        if (item.getTitle().equals("Delete")) {
                            conferenceTable.delete(conference.id);
                        } else if (item.getTitle().equals("Edit")) {
                        }
                        return false;
                    }
                });
            }
        });
        ...

        return convertView;
    }