Android Room新增数据后RecyclerView不实时刷新问题解决
Android计算器应用历史记录实时刷新异常问题
问题说明
- 正在开发一款Android计算器应用,包含计算页、历史记录页两个页面
- 应用通过Room数据库存储三类数据:数学运算表达式、运算结果、运算时间
- 预期效果:点击「等于」按钮完成计算后,历史页可实时展示上述三类数据
- 现存异常:
- 新增计算记录后,必须关闭重启应用才能在历史页加载到新数据,多次尝试调用
notifyDataSetChanged()均未生效 - 偶发历史页完全不显示任何数据的问题
- 初步调整后问题仍未解决:已确认向数据库插入数据后,适配器绑定的
localDataset数据集长度会增长,但RecyclerView始终无法刷新展示新数据
- 新增计算记录后,必须关闭重启应用才能在历史页加载到新数据,多次尝试调用
- 如需更多排查相关信息可随时告知
项目相关代码
列表适配器(CalculatorListAdapter.java)
package com.example.simplecalculator; import android.annotation.SuppressLint; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import java.util.List; public class CalculatorListAdapter extends RecyclerView.Adapter<CalculatorListAdapter.ViewHolder> { public CalculatorListAdapter() { } public List<CalculationEntities> localDataset; public CalculatorListAdapter(List<CalculationEntities> dataset) { localDataset = dataset; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.calculation_history_item, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull CalculatorListAdapter.ViewHolder holder, int position) { holder.itemView.setTag(position); holder.tvCalculation.setText(localDataset.get(position).calculation); holder.tvResult.setText(localDataset.get(position).result); holder.tvTimeStamp.setText(localDataset.get(position).timeStamp); } @Override public int getItemCount() { return localDataset.size(); } public static class ViewHolder extends RecyclerView.ViewHolder { public final TextView tvResult; public final TextView tvCalculation; public final TextView tvTimeStamp; public ViewHolder(View itemView) { super(itemView); tvCalculation = (TextView) itemView.findViewById(R.id.tvOperation); tvResult = (TextView) itemView.findViewById(R.id.tvResult); tvTimeStamp = (TextView) itemView.findViewById(R.id.tvTimeStamp); } } }
历史记录页Fragment(History.java)
package com.example.simplecalculator; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.room.RoomDatabase; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import java.util.Arrays; import java.util.List; public class History extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 加载页面布局 return inflater.inflate(R.layout.fragment_history, container, false); } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { RecyclerView rvHistory = view.findViewById(R.id.rvCalculationHistory); List<CalculationEntities> dataset = Arrays.asList(Calculator.database.CalculatorDao().getAllCalculations()); CalculatorListAdapter calculatorListAdapter = new CalculatorListAdapter(dataset); rvHistory.setAdapter(calculatorListAdapter); rvHistory.setLayoutManager(new LinearLayoutManager(getContext())); super.onViewCreated(view, savedInstanceState); } }
DAO接口(CalculatorDao.java)
package com.example.simplecalculator; import androidx.room.Dao; import androidx.room.Insert; import androidx.room.OnConflictStrategy; import androidx.room.Query; @Dao public interface CalculatorDao { @Query("SELECT * FROM CalculationEntities WHERE calculation LIKE :name LIMIT 1") CalculationEntities findByName(String name); @Insert(onConflict = OnConflictStrategy.REPLACE) void insertAll(CalculationEntities... calculations); @Query("SELECT * FROM CalculationEntities") CalculationEntities[] getAllCalculations(); @Query("DELETE FROM CalculationEntities") void deleteAll(); }
数据实体类(CalculationEntities.java)
package com.example.simplecalculator; import androidx.room.ColumnInfo; import androidx.room.Entity; import androidx.room.PrimaryKey; @Entity public class CalculationEntities { @PrimaryKey(autoGenerate = true) public int CalculationID; @ColumnInfo(name="calculation") public String calculation; @ColumnInfo(name="result") public String result; @ColumnInfo(name="timeStamp") public String timeStamp; }
数据库定义类(CalculatorDatabase.java)
package com.example.simplecalculator; import androidx.room.Database; import androidx.room.RoomDatabase; @Database(entities = {CalculationEntities.class}, version = 1) public abstract class CalculatorDatabase extends RoomDatabase { public abstract CalculatorDao CalculatorDao(); }
内容的提问来源于stack exchange,提问作者Zibal
相关产品推荐
相关产品推荐

