Search code examples
androidlistviewandroid-popupwindowandroid-loader

Remove a row of ListView attached with AsyncTaskLoader


I have implemented a ListView with ListFragment which is attached with a AsyncTaskLoader. The data is populated from database. Each row has a menu button for PopUp which further has 2 options (Edit & Delete).

What I want is, when any of the option is clicked, that object is deleted from database.

How can I get id of the deleted object?

My Adapter:

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

Solution

  • Sometimes, good coding practices may lead to difficult situation. Anyhow, I moved the event listeners inside getView(...) and I was able to access the object. May be helpful for someone in future.

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