房间数据:当我单击“保存”按钮时,它可以正常工作!但是问题是我必须重新启动应用程序,然后我才能在recyclerview上看到数据

问题描述

当我单击“保存”按钮时,数据已存储,但问题是我必须在移动设备上重新启动android应用,然后在RecyclerView显示数据时才重新启动。这是我的代码

主要活动

public class MainActivity extends AppCompatActivity {

    EditText etFirstname,etLastname;
    Button btnSave;
    AppDatabase database;

    RecyclerView recyclerView;
    RecyclerView.Adapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new linearlayoutmanager(this));

        database = Room.databaseBuilder(getApplicationContext(),AppDatabase.class,"userdb").allowMainThreadQueries().build();

        etFirstname = findViewById(R.id.editTextFirstName);
        etLastname = findViewById(R.id.editTextLastName);

        btnSave = findViewById(R.id.saveBtn);
        btnSave.setonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String fName = etFirstname.getText().toString();
                String lName = etLastname.getText().toString();

                if (fName.isEmpty() || lName.isEmpty()) {
                    Toast.makeText(MainActivity.this,"please enter data!",Toast.LENGTH_SHORT).show();
                } else {
                    User user = new User();
                    user.setFirstName(fName);
                    user.setLastName(lName);

                    database.dao().addUser(user);
                    Toast.makeText(MainActivity.this,"User Added!",Toast.LENGTH_SHORT).show();
                }
            }
        });

        adapter = new UserAdapter(database.dao().getUsers());
        recyclerView.setLayoutManager(new linearlayoutmanager(this));
        recyclerView.setAdapter(adapter);

    }
}

适配器类

public class UserAdapter extends RecyclerView.Adapter<UserAdapter.ViewHolder> {

    private List<User> users;

    public UserAdapter(List<User> users) {
        this.users = users;
    }


    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.user_list_row,parent,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder,int position) {
        holder.textViewFirst.setText(users.get(position).firstName);
        holder.textViewLast.setText(users.get(position).lastName);
    }

    @Override
    public int getItemCount() {
        return users.size();
    }
    
    public class ViewHolder extends RecyclerView.ViewHolder {

        TextView textViewFirst,textViewLast;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            textViewFirst = itemView.findViewById(R.id.tvFirstName);
            textViewLast = itemView.findViewById(R.id.tvLastName);
        }
    }
}

解决方法

您的适配器需要一个用户列表let a = [17,28,30]; let b = [99,16,8]; function compareTriplets([a,b,c],[d,e,f]) { return [ (a > d) + (b > e) + (c > f),(a < d) + (b < e) + (c < f) ] } console.log(compareTriplets(a,b));,并且您在创建活动时仅将其传递一次,但是在第一次加载该列表后就不会更新该列表。 onCreate仅激活一次,并为按钮创建一个点击侦听器,这是您的责任,此后需要更新并添加到现有列表中。

尝试执行以下操作: 由于您的适配器中的用户列表是私有的,因此请创建一个函数以在现有列表中添加新用户,如下所示:

List<User> users

尝试在public void add(User user) { users.add(user); notifyItemInserted(users.size() - 1); } 的else块的末尾添加adapter.add(user)

仅说明一下,btnSave.onClickListener会在列表的最后位置通知recyclerView有关新物品的信息,以便它可以刷新数据

,

添加到错误中指出您没有更新数据。取消手动更新的另一种解决方案是改用LiveData。 它将处理数据更改。以下是将RoomLiveData

结合使用的指南

https://codelabs.developers.google.com/codelabs/android-room-with-a-view/#6