简体   繁体   English

单击 android 中的删除按钮时如何从列表视图中删除所选项目

[英]How to remove selected item from listview when click remove button in android

When i click button removeAll, the program deletes all items in listView.当我单击按钮 removeAll 时,程序会删除 listView 中的所有项目。 When I click the checkbox of the items, press the button removeSelected button to delete the selected items.当我单击项目的复选框时,按下按钮 removeSelected 按钮以删除所选项目。 However, the program only shows the unchecked checkboxes of the selected items, but does not actually delete those selected items from the listView.但是,程序只显示选中项的未选中复选框,而实际上并没有从 listView 中删除这些选中项。 Thanks for the help!!!谢谢您的帮助!!!

Here is my app interface:这是我的应用程序界面:

在此处输入图像描述

MainActivity.class: MainActivity.class:

public class MainActivity extends AppCompatActivity {

    private ListView listView;
    private ArrayList<Phone> data;
    private PhoneAdapter adapter;
    private Button buttonSelected, buttonAll;
    private ArrayList<Boolean> checkboxes;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
        initData();
    }

    private void initView() {
        listView = findViewById(R.id.listView);
        buttonSelected = findViewById(R.id.buttonSelected);
        buttonAll = findViewById(R.id.buttonAll);
        checkboxes = new ArrayList<>();

        buttonSelected.setOnClickListener(view -> removeSelected());
        buttonAll.setOnClickListener(view -> removeAll());

    }

    private void initData() {
        data = new ArrayList<>();
        data.add(new Phone(R.drawable.phone_icon, "Apple", false));
        data.add(new Phone(R.drawable.phone_icon, "Samsung", false));
        data.add(new Phone(R.drawable.phone_icon, "Nokia", false));
        data.add(new Phone(R.drawable.phone_icon, "Oppo", false));
        data.add(new Phone(R.drawable.phone_icon, "Xiaomi", false));
        data.add(new Phone(R.drawable.phone_icon, "Asus", false));
        data.add(new Phone(R.drawable.phone_icon, "Lenovo",false));
        data.add(new Phone(R.drawable.phone_icon, "LG", false));
        data.add(new Phone(R.drawable.phone_icon, "Vivo", false));
        data.add(new Phone(R.drawable.phone_icon, "Huawei", false));
        data.add(new Phone(R.drawable.phone_icon, "OnePlus", false));
        data.add(new Phone(R.drawable.phone_icon, "Realme", false));
        data.add(new Phone(R.drawable.phone_icon, "Google", false));
        data.add(new Phone(R.drawable.phone_icon, "Sony", false));
        data.add(new Phone(R.drawable.phone_icon, "ZTE", false));

        adapter = new PhoneAdapter(this, R.layout.item_view, data);
        listView.setAdapter(adapter);

    }

    private void removeSelected() {
        for (int i = data.size() - 1; i >= 0; i--) {
            if (data.get(i).isChecked()) {
                data.remove(i);
            }
        }
        adapter.notifyDataSetChanged();
    }

    private void removeAll() {
        data.clear();
        adapter.notifyDataSetChanged();

        if (data.size() == 0) {
            Toast.makeText(this, "List of phone is empty", Toast.LENGTH_LONG).show();
        }
    }

}

PhoneAdapter.class:电话适配器.class:

public class PhoneAdapter extends ArrayAdapter<Phone> {

    private final Context context;
    private final int layout;
    private final List<Phone> data;

    private ArrayList<Boolean> checkboxes;

    public PhoneAdapter(@NonNull Context context, int layout, @NonNull List<Phone> data) {
        super(context, layout, data);
        this.context = context;
        this.layout = layout;
        this.data = data;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View prevView, @NonNull ViewGroup parent) {
        View view;
        Holder holder;
        if (prevView == null) {
            view = LayoutInflater.from(context).inflate(layout, parent, false);

            holder = new Holder();

            holder.icon = view.findViewById(R.id.imageView);
            holder.textView = view.findViewById(R.id.textView);
            holder.checkBox = view.findViewById(R.id.checkBox);

            view.setTag(holder);
        }
        else {
            view = prevView;
            holder = (Holder) view.getTag();
        }

        Phone phone = data.get(position);

        holder.icon.setImageResource(phone.getIcon());
        holder.textView.setText(phone.getName());
        holder.checkBox.setChecked(phone.isChecked());

        return view;

    }

    static class Holder {
        ImageView icon;
        TextView textView;
        CheckBox checkBox;
    }
}

Phone.class:电话.class:

public class Phone {

    private int icon;
    private String name;
    private boolean checked;

    public Phone(int icon, String name, boolean checked) {
        this.icon = icon;
        this.name = name;
        this.checked = checked;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getIcon() {
        return icon;
    }

    public void setIcon(int icon) {
        this.icon = icon;
    }

    public boolean isChecked() {
        return checked;
    }

    public void setChecked(boolean checked) {
        this.checked = checked;
    }
}

As @fancy_bitz already stated.正如@fancy_bitz 已经说过的那样。 You should not remove an object from a list during iteration as it can lead to unexpected behaviour.您不应在迭代期间从列表中删除 object,因为它可能导致意外行为。

        for (int i = data.size() - 1; i >= 0; i--) {
            if (data.get(i).isChecked()) {
                data.remove(i);
            }
        }

In your case this is working fine because data.size() is being reevaluated during each iteration step.在您的情况下,这工作正常,因为 data.size() 在每个迭代步骤中都被重新评估。

What you can do is clearing the list in your model and readd all remaining phones.您可以做的是清除 model 中的列表并读取所有剩余的手机。 Filter all items that are not checked and collect them in a new List过滤所有未勾选的项目,并收集到一个新的List中

List<Phone> remaining_items = 
    data.stream().filter(Predicate.not(Phone::isChecked)).collect(Collectors.toList());

Then add them to your originally and cleared list.然后将它们添加到您最初清除的列表中。

instead of removing from controller use delegate (Adapter) create a method that removes data from the internal list.而不是从 controller 中删除,而是使用委托(适配器)创建一个从内部列表中删除数据的方法。 and use.remove并使用.remove

Better Approach would be to use RecyclerView for better performance更好的方法是使用RecyclerView以获得更好的性能

    public class PhoneAdapter extends ArrayAdapter<Phone> {
    
    private final ArrayList<Phone> data;


    private void removeSelected(Int position) {

      data.remove(position);
      notifyDataSetChanged()
      //data.removeAt(position)
     // notifyItemRemoved(position)
    }

 private void removeSelected(Phone item) {

      data.remove(position);
     //notifyItemRemoved(position)
      notifyDataSetChanged()

    }

    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM