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