删除一行附加了 AsyncTaskLoader 的 ListView
Remove a row of ListView attached with AsyncTaskLoader
我已经实现了 ListView
和 ListFragment
并附有 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;
}
我已经实现了 ListView
和 ListFragment
并附有 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;
}