Android listview删除行无效

时间:2015-12-28 07:08:11

标签: android android-listview

我想在用户点击要删除的按钮时删除一行。 我面临的问题是,如果我删除任何行,它将删除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;
    }
}

8 个答案:

答案 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(); 
}