我有一个带有一堆物品的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();
}
}
}
我有解决方法。
复选框和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)}
setOnCheckedChangeListener
的viewAvailability
内部,当用户选中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
的额外属性,并带有getter
和setter
,如
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)
}
}
});
}
希望它对您有帮助。 快乐编码
在ItemAdapter
中覆盖这些方法
@Override
public int getItemViewType(int position) {
return position; // return position
}
@Override
public long getItemId(int position) {
return position; // return position
}
这些方法有助于recyclerView
唯一地标识项目,因此可以解决您的复选框问题。