我创建了一个简单的笔记应用程序。尝试了多种方法,但无法动态更新回收站视图(无需滑动)
自定义适配器类
我在适配器类中使用了一个方法 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 Library 作为抽象层来访问应用程序的 SQLite 数据库中的信息。
但是,您可以将使用 Android Room(SQLite 的抽象层)与 MVVM 模式一起使用 - 它可以处理数据,并且您将能够动态地将数据添加到 RecyclerView(LiveData)。
阅读关于MVVM、LiveData 和 Room 的android devs 教程,它相对简单。
您将需要创建:数据实体(您的表项)、DAO 接口、数据库本身(无需手动编写庞大的内容)、存储库(DAO 和 ViewModel 之间的中介)和 ViewModel(谁将跟踪您的数据并在整个生命周期中保留它) ,然后将其连接到回收站视图。
进一步阅读
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句