0

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;
        ...
    }
}
Shahzeb
  • 3,696
  • 4
  • 28
  • 47

1 Answers1

0

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;
    }
Shahzeb
  • 3,696
  • 4
  • 28
  • 47