在android工作室中更新recyclerview


我创建了一个简单的note应用程序。尝试了几种方法,但无法动态更新回收器视图(无刷(

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体系结构组件

最新更新