[英]Room Database : RecyclerView does not update after delete data in detail activity
[英]RecyclerView does not update ROOM Database although data exists
我的Entity
class 看起来像这样:
@Entity
public class User {
public int getId() {
return id;
}
@NonNull
public ArrayList<String> getValues(){
return values;
}
@NonNull
public ArrayList<String> getDates(){
return dates;
}
@NonNull
public String getType_counter() {
return type_counter;
}
@NonNull
public String getWhere_counter() {
return where_counter;
}
@PrimaryKey(autoGenerate = true)
public int id;
@ColumnInfo(name = "d")
@TypeConverters({Converters.class})
public ArrayList<String> dates;
@ColumnInfo(name = "value")
@TypeConverters({Converters.class})
public ArrayList<String> values;
@ColumnInfo(name = "type")
public String type_counter;
@ColumnInfo(name = "location")
public String where_counter;
}
我有一个仅显示类型和位置的 RecyclerView,当您单击任何项目时,它会转到另一个活动,其中另一个 RecyclerView 将这个特定用户(按 Id)的值和日期显示为 arrays。
我的问题是:我的应用程序的用户可以创建新User
object 或update
它(将值和日期添加到 ArrayLists),并且在更新 RecyclerView 时无法正常工作。
假设我有两个User
对象,我的数据库如下所示:
我的拳头 object 有两个值和日期,但 RecyclerView 只显示一个。
当我向第二个User
object 添加另一个值和日期时,RecyclerView 显示两个对象中的两个元素。
这就是我更新值的方式:
private void saveNewValue(String value, String type, String location){
// Getting current date
Date c = Calendar.getInstance().getTime();
SimpleDateFormat df = new SimpleDateFormat("dd-MMM-yyyy", Locale.getDefault());
String formattedDate = df.format(c);
userViewModel = ViewModelProviders.of(this).get(UserViewModel.class);
// checking if the counter exists
int mList = userViewModel.setTypeLocation(type, location);
if (mList == 0){
//Saving new User
User user = new User();
if (user.values == null){
user.values = new ArrayList<String>();
}
if (user.dates == null){
user.dates = new ArrayList<String>();
}
user.values.add(value);
user.dates.add(formattedDate);
user.type_counter = type;
user.where_counter = location;
userViewModel.insert(user);
Toast.makeText(this, "Successfully saved!", Toast.LENGTH_SHORT).show();
}
else {
//Getting current data
User mUser = userViewModel.getUserWithLocationType(type, location);
ArrayList<String> values_user = mUser.getValues();
ArrayList<String> dates_user = mUser.getDates();
// Updating arrays
values_user.add(value);
dates_user.add(formattedDate);
// Creating new User object with updated values
User updatedUser = new User();
updatedUser.id = mUser.getId();
updatedUser.type_counter = type;
updatedUser.where_counter = location;
updatedUser.values = values_user;
updatedUser.dates = dates_user;
userViewModel.update(updatedUser);
//userAdapter.notifyItemChanged();
Toast.makeText(this, "Successfully updated!", Toast.LENGTH_SHORT).show();
}
}
这是已描述RecyclerView
的Adapter
class :
public class CalculationAdapter extends RecyclerView.Adapter<CalculationAdapter.CalcViewHolder>{
private LayoutInflater inflater;
private Context mContext;
private ArrayList<String> mValues;
private ArrayList<String> mDates;
private User mUser;
public CalculationAdapter(Context ctx){
inflater = LayoutInflater.from(ctx);
mContext = ctx;
}
public void setUser(User user){
mUser = user;
mValues = user.getValues();
mDates = user.getDates();
notifyDataSetChanged();
Log.i("values", String.valueOf(mValues));
Log.i("dates", String.valueOf(mDates));
}
@NonNull
@Override
public CalculationAdapter.CalcViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.calculations_item, parent, false);
CalculationAdapter.CalcViewHolder holder = new CalculationAdapter.CalcViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull CalculationAdapter.CalcViewHolder holder, int position) {
if (mValues != null & mDates != null){
String value = mValues.get(position);
String date = mDates.get(position);
holder.setValuesDates(value, date, position);
}
else{
holder.mValue.setText("No value");
holder.mDate.setText("No date");
}
}
@Override
public int getItemCount() {
if (mValues != null){
return mValues.size();
} else return 0;
}
class CalcViewHolder extends RecyclerView.ViewHolder {
private TextView mValue;
private TextView mDate;
private int mPosition;
public CalcViewHolder(@NonNull View itemView) {
super(itemView);
mValue = itemView.findViewById(R.id.item_value);
mDate = itemView.findViewById(R.id.item_date);
}
public void setValuesDates(String value, String date, int position){
mValue.setText(value);
mDate.setText(date);
mPosition = position;
}
}
}
这是 ViewModel class:
public class UserViewModel extends AndroidViewModel {
private String TAG = this.getClass().getSimpleName();
private UserDao userDao;
private AppDatabase appDatabase;
private LiveData<List<User>> mAllUsers;
private LiveData<String[]> mAllLocations;
private LiveData<User> mUser;
private int UserLocationTypeExists;
public UserViewModel(@NonNull Application application) {
super(application);
appDatabase = AppDatabase.getInstance(application);
userDao = appDatabase.userDao();
mAllUsers = userDao.getAllValues();
mAllLocations = userDao.getAllLocations();
}
public void setId(int id){
mUser = userDao.getUserWithId(id);
}
public User getUserWithLocationType(String type, String location){
return userDao.getUserwithLocationType(type, location);
}
public int setTypeLocation(String type, String location){
UserLocationTypeExists = userDao.UserWithTypeLocationExists(type, location);
return UserLocationTypeExists;
}
public void update(User user) {
new UpdateAsyncTask(userDao).execute(user);
}
public void insert(User user){
new InsertAsyncTask(userDao).execute(user);
}
public void delete(User user){
new DeleteAsyncTask(userDao).execute(user);
}
public LiveData<List<User>> getAllUsers(){
return mAllUsers;
}
public LiveData<String[]> getAllLocations() {
return mAllLocations;
}
public LiveData<User> getUserAtId(){
return mUser;
}
private class InsertAsyncTask extends AsyncTask<User, Void, Void> {
UserDao userDao;
public InsertAsyncTask(UserDao userDao) {
this.userDao = userDao;
}
@Override
protected Void doInBackground(User... users) {
userDao.insertValue(users[0]);
return null;
}
}
private class DeleteAsyncTask extends AsyncTask<User, Void, Void> {
UserDao userDao;
public DeleteAsyncTask(UserDao userDao) {
this.userDao = userDao;
}
@Override
protected Void doInBackground(User... users) {
userDao.deleteValue(users[0]);
return null;
}
}
private class UpdateAsyncTask extends AsyncTask<User, Void, Void> {
UserDao userDao;
public UpdateAsyncTask(UserDao userDao) {
this.userDao = userDao;
}
@Override
protected Void doInBackground(User... users) {
userDao.update(users[0]);
return null;
}
}
}
这是我有RecyclerView
的Activity
:
public class CalculationActivity extends AppCompatActivity{
private int id_counter;
private UserViewModel userViewModel;
private CalculationAdapter calcAdapter;
private int rate;
private String value1, date1, value2, date2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calculation);
Bundle extras = getIntent().getExtras();
if (extras != null) {
id_counter = extras.getInt("id");
}
RecyclerView recyclerView = findViewById(R.id.recyclerView_calc);
calcAdapter = new CalculationAdapter(this);
recyclerView.setAdapter(calcAdapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setHasFixedSize(true);
userViewModel = ViewModelProviders.of(this).get(UserViewModel.class);
userViewModel.setId(id_counter);
userViewModel.getUserAtId().observe(this, new Observer<User>() {
@Override
public void onChanged(User user) {
calcAdapter.setUser(user);
}
});
}
}
有人可以帮我弄清楚为什么我的 RecyclerView 不能正确更新数据吗? 提前致谢。
如有必要,我可以添加更多信息。
这是TypeConverters.class
:
public class Converters {
@TypeConverter
public static ArrayList<String> fromString(String value) {
Type listType = new TypeToken<ArrayList<String>>() {}.getType();
return new Gson().fromJson(value, listType);
}
@TypeConverter
public static String fromArrayList(ArrayList<String> list) {
Gson gson = new Gson();
return gson.toJson(list);
}
}
编辑:我在数据库中保存了不同的值。 这是数据库的外观:
这是Activity1
:
当我单击这两个项目时,它们都显示值2222
:
SetUser
方法的 Output (当我单击每个项目时):
I/values: [2222]
I/dates: [27-Juli-2022]
I/values: [2222]
I/dates: [27-Juli-2022]
小错误...我一直以错误的方式向 Activity2 发送 ID。 我一直在遍历所有元素的onBindViewHolder
方法中得到它,这就是为什么我只从最后保存的元素中获得值的原因。 我需要在OnClick
方法中的Holder
class 中获取 ID。 无论如何,感谢您的所有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.