问题描述
当我单击“保存”按钮时,数据已存储,但问题是我必须在移动设备上重新启动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
。
它将处理数据更改。以下是将Room
与LiveData
https://codelabs.developers.google.com/codelabs/android-room-with-a-view/#6