[英]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.