Android listview 删除行不起作用
Android listview Delete row not working
我试图在用户单击删除按钮时删除一行。
我面临的问题是,如果我删除任何行,它会删除 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;
}
}
private void deleteRow(int position)
{
menuItems.remove(position);
notifyDataSetChanged();
}
如下更改您的 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;
}
用这些代码替换代码....这可能对您有所帮助
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;
}
您不能直接从此处删除视图,除非您的适配器在 Activity Class 内。通过使用您的代码,您无法为超级 class 构造函数提供更新。
因此您可以在 Activity -
中尝试此代码
listview.setOnItemClickListner(.... use listner
menuItems.remove(position);
MenuDetailsAdapter adapter = MenuDetailsAdapter(Activity activity, List<MenuItem> menuItems);
adapter.notifyDataSetChanged();
);
用这些代码替换代码....这可能对您有所帮助。您只能更改 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());
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();
}
}
}
您的 ListView
工作正常,但是,您似乎误解了 Android 中的 ListView
的工作原理。在 Android 中为了节省内存 ListView
s 使用 recycling mechanism.
您在 getView
中的逻辑不正确,您每隔 convertView
就返回一次 null
。实际上,每个非空 convertView
s 都是那些已经离开屏幕或已从模型中删除的剪贴视图。
在您的情况下,每当您删除一行时,其对应的视图将被标记为废料并将从 ListView
中删除,因此,您的 ListView
将丢失其中一行现在确实需要另一行来覆盖它的所有区域。因此,它从 getView
方法请求另一行,在那里,您将返回相同的 removed/scrap 视图,而您不应该这样做。
使用这个:
public void deleteRow(int position)
{
menuItems.remove(position);
adapter.notifyDataSetChanged();
}
我试图在用户单击删除按钮时删除一行。 我面临的问题是,如果我删除任何行,它会删除 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;
}
}
private void deleteRow(int position)
{
menuItems.remove(position);
notifyDataSetChanged();
}
如下更改您的 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;
}
用这些代码替换代码....这可能对您有所帮助
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;
}
您不能直接从此处删除视图,除非您的适配器在 Activity Class 内。通过使用您的代码,您无法为超级 class 构造函数提供更新。
因此您可以在 Activity -
中尝试此代码listview.setOnItemClickListner(.... use listner
menuItems.remove(position);
MenuDetailsAdapter adapter = MenuDetailsAdapter(Activity activity, List<MenuItem> menuItems);
adapter.notifyDataSetChanged();
);
用这些代码替换代码....这可能对您有所帮助。您只能更改 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());
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();
}
}
}
您的 ListView
工作正常,但是,您似乎误解了 Android 中的 ListView
的工作原理。在 Android 中为了节省内存 ListView
s 使用 recycling mechanism.
您在 getView
中的逻辑不正确,您每隔 convertView
就返回一次 null
。实际上,每个非空 convertView
s 都是那些已经离开屏幕或已从模型中删除的剪贴视图。
在您的情况下,每当您删除一行时,其对应的视图将被标记为废料并将从 ListView
中删除,因此,您的 ListView
将丢失其中一行现在确实需要另一行来覆盖它的所有区域。因此,它从 getView
方法请求另一行,在那里,您将返回相同的 removed/scrap 视图,而您不应该这样做。
使用这个:
public void deleteRow(int position)
{
menuItems.remove(position);
adapter.notifyDataSetChanged();
}