簡體   English   中英

單擊 android 中的刪除按鈕時如何從列表視圖中刪除所選項目

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

當我單擊按鈕 removeAll 時,程序會刪除 listView 中的所有項目。 當我單擊項目的復選框時,按下按鈕 removeSelected 按鈕以刪除所選項目。 但是,程序只顯示選中項的未選中復選框,而實際上並沒有從 listView 中刪除這些選中項。 謝謝您的幫助!!!

這是我的應用程序界面:

在此處輸入圖像描述

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

}

電話適配器.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;
    }
}

電話.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;
    }
}

正如@fancy_bitz 已經說過的那樣。 您不應在迭代期間從列表中刪除 object,因為它可能導致意外行為。

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

在您的情況下,這工作正常,因為 data.size() 在每個迭代步驟中都被重新評估。

您可以做的是清除 model 中的列表並讀取所有剩余的手機。 過濾所有未勾選的項目,並收集到一個新的List中

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

然后將它們添加到您最初清除的列表中。

而不是從 controller 中刪除,而是使用委托(適配器)創建一個從內部列表中刪除數據的方法。 並使用.remove

更好的方法是使用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