CustomAdpater类
我在适配器类中使用了一个方法setValues,该方法在主活动中被调用以更新数据,但它不起作用。还有另一项将数据添加到数据库的活动
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder> {
Context context;
ArrayList<Model> models;
public CustomAdapter(Context context, ArrayList<Model> models){
this.context = context;
this.models = models;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.list_content, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.string_text.setText(models.get(holder.getAdapterPosition()).getText());
holder.time_text.setText(models.get(holder.getAdapterPosition()).getNotes());
holder.constraintLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context.getApplicationContext(), NotesDetails.class);
intent.putExtra("position", String.valueOf(holder.getAdapterPosition()));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() { return models.size(); }
public class MyViewHolder extends RecyclerView.ViewHolder {
TextView string_text, time_text;
ConstraintLayout constraintLayout;
public MyViewHolder(View itemView) {
super(itemView);
string_text = itemView.findViewById(R.id.textView);
time_text = itemView.findViewById(R.id.timeshow);
constraintLayout = itemView.findViewById(R.id.constraintLayout);
}
}
public void setValues(ArrayList<Model> models){
this.models = models;
}
}
主要活动
public class MainActivity extends AppCompatActivity {
DBHelper db;
RecyclerView recyclerView;
CustomAdapter customAdapter;
ArrayList<Model> models;
FloatingActionButton fab;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recyclerView);
db = new DBHelper(this);
models = new ArrayList<>();
customAdapter = new CustomAdapter(this, models);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(customAdapter);
fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
addData();
}
});
displayData();
}
private void addData() {
Intent intent = new Intent(this, DataAdd.class);
startActivity(intent);
}
void displayData() {
Cursor cursor = db.viewData();
while (cursor.moveToNext()){
Model model = new Model(cursor.getString(1), cursor.getString(2));
models.add(model);
customAdapter.setValues(models);
customAdapter.notifyDataSetChanged();
}
}
}
这是行不通的,因为如果不刷新整个应用程序,就无法直接从SQLite(我建议(向回收器视图添加数据。
Android开发者建议使用Android Room而不是纯SQLite API:
注意:尽管这些API功能强大,但它们的级别相当低并且需要大量的时间和精力来使用:
没有原始SQL查询的编译时验证。随着数据图的更改,您需要更新受影响的SQL查询手动。这个过程可能很耗时,而且容易出错。您需要使用大量样板代码在SQL查询和数据对象之间进行转换。
出于这些原因,我们强烈建议使用Room Persistence库作为一个抽象层,用于访问应用程序的SQLite数据库。
但是,您可以使用MVVM模式的use Android Room(SQLite的抽象层(-它可以处理数据,并且您将能够动态地将数据添加到RecyclerView(LiveData(
阅读android开发人员关于MVVM、LiveData和Room的教程,它相对简单。
您将需要创建:数据实体(您的表项(、DAO接口、数据库本身(无需手动编写庞大的内容(、存储库(DAO和ViewModel之间的中介(和ViewModel(谁将跟踪您的数据并在整个生命周期中保存它,然后将它连接到回收器视图。
用于进一步读取
- LiveData
- ViewModel
- 从SQLite迁移到Room
- Android体系结构组件