我如何使recyclerView中的CheckBox正常工作?

问题描述 投票:0回答:3

我有一个带有一堆物品的recyclerView,这些物品带有一个复选框,以指出有空房。选中复选框后,该项目应出现在回收站中,这是通过更新数据库来完成的。此格式适用于某些项目,尤其是回收站末尾的项目,而对于其他项目则无效。我该如何解决?

 public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ItemHolder> {
private TextView viewName, viewPrice, viewStock;
private CheckBox viewAvailability;

private Context context;
private List<Item> listItems;

private DBHelper db;
@NonNull
@Override
public ItemAdapter.ItemHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View view = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);
    return new ItemAdapter.ItemHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ItemAdapter.ItemHolder holder, int position) {
    Item item = listItems.get(position);
    holder.setDetails(item);

}

@Override
public int getItemCount() {
    return listItems.size();
}


public class ItemHolder extends RecyclerView.ViewHolder {
    public ItemHolder(final View itemView) {
        super(itemView);
        viewName = itemView.findViewById(R.id.viewName);
        viewPrice = itemView.findViewById(R.id.viewPrice);
        viewStock = itemView.findViewById(R.id.viewStock);
        viewAvailability = itemView.findViewById(R.id.viewAvailability);
    }

    public void setDetails(final Item item) {
        db = new DBHelper(context);
        viewName.setText(item.getName());
        viewPrice.setText(item.getPrice());
        viewStock.setText(String.valueOf(item.getStock()));
        int as = item.getAvailabilityStatus();

        if (as == 1) {
            viewAvailability.setChecked(true);
        } else {
        }

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Toast.makeText(context, String.valueOf(item.getId()), Toast.LENGTH_SHORT).show();
                Bundle dataBundle = new Bundle();
                dataBundle.putInt("id",item.getId());
                Intent intent = new Intent(context,NewItemActivity.class);
                intent.putExtras(dataBundle);
                context.startActivity(intent);
            }
        });

        viewAvailability.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
                if (viewAvailability.isChecked()){
                    //Toast.makeText(context, item.getId() + "is checked", Toast.LENGTH_SHORT).show();
                    //db.updateItem(new Item(item.getName(),item.getPrice(),1,0));
                   // db.updateItem(item.getId(),item.getName(),item.getPrice(),1,0);
                    changeAvailabilty(item.getId(),item.getName(),item.getPrice(),1,1,0);
                } else {
                   // db.updateItem(new Item(item.getName(),item.getPrice(),0,0));
                   // db.updateItem(item.getId(),item.getName(),item.getPrice(),0,0);
                    changeAvailabilty(item.getId(),item.getName(),item.getPrice(),1,0,0);
                }
            }
        });
    }
}

public ItemAdapter(Context context, List<Item> objects) {
    this.context = context;
    this.listItems = objects;
}

public void changeAvailabilty(int id, String name, String price, int stock, int av, int st) {
    if (av == 1){
        db.updateItem(id,name,price, stock,av,st);
        Toast.makeText(context, "is checked", Toast.LENGTH_SHORT).show();
    } else {
        db.updateItem(id,name,price, stock,av,st);
        Toast.makeText(context, "is not checked", 

Toast.LENGTH_SHORT).show();
        }
    }
}
android android-recyclerview android-checkbox
3个回答
0
投票

我有解决方法。

复选框和recyclerview的问题结合在一起,当您滚动recyclerview时,持有人被销毁,viewholders状态也被破坏,因此,如果要存储视图状态,则必须将其存储在viewholder或recyclerview所存储的数据中显示。

就像您正在显示项目

private List<Item> listItems;

在列表项类中,包括被选中的布尔值,默认情况下将其设为false。

每当您勾选该框时,写上

listitems.checkboxstate=false;

并且当您更改复选框状态时,请设为true

listitems.checkboxstate=true;

但是在执行此操作之前,必须确保先前已选中此复选框

if(listitems.checkboxstate){checkbox.setchecked(true)}
else{checkbox.setchacked(false)}

0
投票

setOnCheckedChangeListenerviewAvailability内部,当用户选中AvailabilityStatus时将1设置为chckbox,否则将其设置为0。如下。

viewAvailability.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
                if (viewAvailability.isChecked()){
                    //Toast.makeText(context, item.getId() + "is checked", Toast.LENGTH_SHORT).show();
                    //db.updateItem(new Item(item.getName(),item.getPrice(),1,0));
                   // db.updateItem(item.getId(),item.getName(),item.getPrice(),1,0);
                    changeAvailabilty(item.getId(),item.getName(),item.getPrice(),1,1,0);

                   // here you have to set Availability Status is 1
                   item.setAvailabilityStatus(1)
                } else {
                   // db.updateItem(new Item(item.getName(),item.getPrice(),0,0));
                   // db.updateItem(item.getId(),item.getName(),item.getPrice(),0,0);
                    changeAvailabilty(item.getId(),item.getName(),item.getPrice(),1,0,0);

                   // here you have to set Availability Status is 0
                   item.setAvailabilityStatus(0)
                }
            }
        });
    }

UPDATE

[在您的Item模型类中,添加一个名为isSelected的额外属性,并带有gettersetter,如

public class Item{
    // your other properties

    private boolean isSelected;

    public boolean getSelected() {
        return isSelected;
    }

    public void setSelected(boolean selected) {
        isSelected = selected;
    }
}

并且在适配器中,如果用户选中了isSelected,则必须将true设置为chekcbox,否则将其设置为false内部的setDetails()。如下。

public void setDetails(final Item item) {
        db = new DBHelper(context);
        viewName.setText(item.getName());
        viewPrice.setText(item.getPrice());
        viewStock.setText(String.valueOf(item.getStock()));
        int as = item.getAvailabilityStatus();

        // Here you should check if it is already checked or not
        if (item.getSelected) {
            viewAvailability.setChecked(true);
        } 

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Toast.makeText(context, String.valueOf(item.getId()), Toast.LENGTH_SHORT).show();
                Bundle dataBundle = new Bundle();
                dataBundle.putInt("id",item.getId());
                Intent intent = new Intent(context,NewItemActivity.class);
                intent.putExtras(dataBundle);
                context.startActivity(intent);
            }
        });

        viewAvailability.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
                if (viewAvailability.isChecked()){
                    //Toast.makeText(context, item.getId() + "is checked", Toast.LENGTH_SHORT).show();
                    //db.updateItem(new Item(item.getName(),item.getPrice(),1,0));
                   // db.updateItem(item.getId(),item.getName(),item.getPrice(),1,0);
                    changeAvailabilty(item.getId(),item.getName(),item.getPrice(),1,1,0);

                   // here you have to set selected true
                   item.setSelected(true)
                } else {
                   // db.updateItem(new Item(item.getName(),item.getPrice(),0,0));
                   // db.updateItem(item.getId(),item.getName(),item.getPrice(),0,0);
                    changeAvailabilty(item.getId(),item.getName(),item.getPrice(),1,0,0);

                   // here you have to set selected false
                   item.setSelected(false)
                }
            }
        });
    }

希望它对您有帮助。 快乐编码


0
投票

ItemAdapter中覆盖这些方法

@Override
public int getItemViewType(int position) {
    return position; // return position
}

@Override
public long getItemId(int position) {
    return position; // return position
}

这些方法有助于recyclerView唯一地标识项目,因此可以解决您的复选框问题。

© www.soinside.com 2019 - 2024. All rights reserved.