在android studio中更新recyclerview

我创建了一个简单的笔记应用程序。尝试了多种方法,但无法动态更新回收站视图(无需滑动)

自定义适配器类

我在适配器类中使用了一个方法 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章