我想在用户点击要删除的按钮时删除一行。 我面临的问题是,如果我删除任何行,它将删除UI上的最后一行。 我有一个Arraylist适配器。点击后,我从arraylist中删除该项目并调用notifydatasetchanged。在调试时我发现在UI上已经删除了正确的项目我看到最后一行没有看到(删除的行仍然可以看到)
public class MenuDetailsAdapter extends BaseAdapter {
private Activity activity;
private LayoutInflater inflater;
private List<MenuItem> menuItems;
private View userView,itemView ;
public MenuDetailsAdapter(Activity activity, List<MenuItem> menuItems) {
this.activity=activity;
this.menuItems = menuItems;
}
@Override
public int getCount() {
return menuItems.size();
}
@Override
public Object getItem(int pos) {
return menuItems.get(pos);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (inflater == null) {
inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
if(convertView==null)
{
convertView= inflater.inflate(R.layout.menu_card_row, null);
ImageView im= (ImageView) convertView.findViewById(R.id.btnRemoveItemRow);
im.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
menuItems.remove(position);
notifyDataSetChanged();
}
});
TextView tvItemName=(TextView) convertView.findViewById(R.id.tvItem_name);
tvItemName.setText(((MenuItem) getItem(position)).getName());
TextView tvItemPrice=(TextView) convertView.findViewById(R.id.tvItemPrice);
tvItemPrice.setText(tvItemPrice.getText().toString()+ ((MenuItem) getItem(position)).getCost());
TextView tvItemQty=(TextView) convertView.findViewById(R.id.tvItem_qty);
tvItemQty.setText(tvItemQty.getText().toString()+ ((MenuItem) getItem(position)).getQuanity());
}
return convertView;
}
}
答案 0 :(得分:0)
private void deleteRow(int position)
{
menuItems.remove(position);
notifyDataSetChanged();
}
答案 1 :(得分:0)
更改你的getView方法如下 -
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if(convertView == null){
convertView= inflater.inflate(R.layout.menu_card_row, null);
}
ImageView im= (ImageView) convertView.findViewById(R.id.btnRemoveItemRow);
im.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
menuItems.remove(position);
notifyDataSetChanged();
}
});
TextView tvItemName=(TextView) convertView.findViewById(R.id.tvItem_name);
tvItemName.setText(((MenuItem) getItem(position)).getName());
TextView tvItemPrice=(TextView) convertView.findViewById(R.id.tvItemPrice);
tvItemPrice.setText(tvItemPrice.getText().toString()+ ((MenuItem) getItem(position)).getCost());
TextView tvItemQty=(TextView) convertView.findViewById(R.id.tvItem_qty);
tvItemQty.setText(tvItemQty.getText().toString()+ ((MenuItem) getItem(position)).getQuanity());
return convertView;
}
答案 2 :(得分:0)
用这些代码替换代码....它可能对您有所帮助
public class MenuDetailsAdapter extends BaseAdapter {
private Activity activity;
private LayoutInflater inflater;
private List<MenuItem> menuItems;
private View userView,itemView ;
public MenuDetailsAdapter(Activity activity, List<MenuItem> menuItems) {
this.activity=activity;
this.menuItems = menuItems;
}
@Override
public int getCount() {
return menuItems.size();
}
@Override
public Object getItem(int pos) {
return menuItems.get(pos);
}
@Override
public long getItemId(int position) {
return position;
}
public class ViewHolder {
ImageView im;
TextView tvItemName;
TextView tvItemPrice;
TextView tvItemQty;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder _viewHolder;
if (convertView == null) {
_viewHolder = new ViewHolder();
LayoutInflater _layInflater = (LayoutInflater) _context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = _layInflater.inflate(R.layout.menu_card_row, null);
_viewHolder.tvItemName=(TextView) convertView.findViewById(R.id.tvItem_name);
_viewHolder.tvItemPrice=(TextView) convertView.findViewById(R.id.tvItemPrice);
_viewHolder.tvItemQty=(TextView) convertView.findViewById(R.id.tvItem_qty)
convertView.setTag(_viewHolder);
} else {
_viewHolder = (ViewHolder) convertView.getTag();
}
_viewHolder.tvItemName.setText(((MenuItem) getItem(position)).getName());
_viewHolder.tvItemPrice.setText(tvItemPrice.getText().toString()+ ((MenuItem) getItem(position)).getCost());
_viewHolder.tvItemQty.setText(tvItemQty.getText().toString()+ ((MenuItem) getItem(position)).getQuanity());
_viewHolder.im.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
menuItems.remove(position);
notifyDataSetChanged();
}
})
return convertView;
}
答案 3 :(得分:0)
除非您的适配器位于Activity Class中,否则无法直接从此处删除视图。通过使用您的代码,您无法为超类构造函数提供更新。
因此,您可以在活动中尝试此代码 -
listview.setOnItemClickListner(.... use listner
menuItems.remove(position);
MenuDetailsAdapter adapter = MenuDetailsAdapter(Activity activity, List<MenuItem> menuItems);
adapter.notifyDataSetChanged();
);
答案 4 :(得分:0)
用这些代码替换代码....它可能对您有所帮助。你只能改变imageview点击监听器。
convertView= inflater.inflate(R.layout.menu_card_row, null);
ImageView im= (ImageView) convertView.findViewById(R.id.btnRemoveItemRow);
im.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
menuItems.remove(position);
notifyDataSetChanged();
}
});
TextView tvItemName=(TextView) convertView.findViewById(R.id.tvItem_name);
tvItemName.setText(((MenuItem) getItem(position)).getName());
TextView tvItemPrice=(TextView) convertView.findViewById(R.id.tvItemPrice);
tvItemPrice.setText(tvItemPrice.getText().toString()+ ((MenuItem) getItem(position)).getCost());
TextView tvItemQty=(TextView) convertView.findViewById(R.id.tvItem_qty);
tvItemQty.setText(tvItemQty.getText().toString()+ ((MenuItem) getItem(position)).getQuanity());
答案 5 :(得分:0)
public class MenuDetailsAdapter extends BaseAdapter {
private Activity activity;
private LayoutInflater inflater;
private List<MenuItem> menuItems;
private View userView,itemView ;
public MenuDetailsAdapter(Activity activity, List<MenuItem> menuItems) {
this.activity=activity;
this.menuItems = menuItems;
}
@Override
public int getCount() {
return menuItems.size();
}
@Override
public Object getItem(int pos) {
return menuItems.get(pos);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView( int position, View convertView, ViewGroup parent) {
if (inflater == null) {
inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
if(convertView==null)
{
convertView= inflater.inflate(R.layout.menu_card_row, null);
ImageView im= (ImageView) convertView.findViewById(R.id.btnRemoveItemRow);
im.setOnClickListener(new Listener(position));
TextView tvItemName=(TextView) convertView.findViewById(R.id.tvItem_name);
tvItemName.setText(((MenuItem) getItem(position)).getName());
TextView tvItemPrice=(TextView) convertView.findViewById(R.id.tvItemPrice);
tvItemPrice.setText(tvItemPrice.getText().toString()+ ((MenuItem) getItem(position)).getCost());
TextView tvItemQty=(TextView) convertView.findViewById(R.id.tvItem_qty);
tvItemQty.setText(tvItemQty.getText().toString()+ ((MenuItem) getItem(position)).getQuanity());
}
return convertView;
}
class Listener implements View.OnClickListener {
private int position;
Listener(int position) {
this.data = position;
}
@Override
public void onClick(View v) {
menuItems.remove(position);
notifyDataSetChanged();
}
}
}
答案 6 :(得分:0)
您的ListView
工作正常,但是,您似乎误解了Android中ListView
的工作原理。在Android中,为了节省内存ListView
,请使用recycling mechanism。
getView
中的逻辑不正确,您返回的每个convertView
都不是null
。实际上,每个非空convertView
都是那些已经离屏或已从模型中删除的剪贴视图。
在您的情况下,每当您删除一行时,其相应的视图都会被标记为废品,并会从ListView
中删除,因此,您的ListView
将失去其中一行确实需要另一排来覆盖其所有区域。因此,它要求getView
方法中的另一行,并且在那里,您将返回相同的已删除/剪贴视图,而您不应该这样做。
答案 7 :(得分:0)
使用它:
public void deleteRow(int position)
{
menuItems.remove(position);
adapter.notifyDataSetChanged();
}