我想在recyclerview上显示所有用户的输入,但是,它只显示最后一个用户的输入。我不知道我做错了什么。谢谢
这是我获得用户输入的班级
public class addEvent extends AppCompatActivity {
private Button addEventButton;
public void events(View view){
Intent intent1 = new Intent(getApplicationContext(), events.class);
startActivity(intent1);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_event);
addEventButton = findViewById(R.id.addEventButton);
addEventButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText timeEditText = findViewById(R.id.timeEditText);
EditText descriptionEditText = findViewById(R.id.descriptionEditText);
final SharedPreferences sharedPreferences = getSharedPreferences("sharedPreferences", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("time", timeEditText.getText().toString());
editor.putString("description", descriptionEditText.getText().toString());
editor.apply();
}
});
}
}
这是视图类
public class events extends AppCompatActivity {
private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;
private List<ListItem> listItems;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_events);
recyclerView = findViewById(R.id.recyclerViewID);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
final SharedPreferences sharedPreferences = getSharedPreferences("sharedPreferences", MODE_PRIVATE);
String timeInfo = sharedPreferences.getString("time", null);
String descriptionInfo = sharedPreferences.getString("description", null);
listItems = new ArrayList<>();
ListItem item = new ListItem(timeInfo, descriptionInfo);
listItems.add(item);
TextWatcher textWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
}
};
adapter = new MyAdapter(this, listItems);
recyclerView.setAdapter(adapter);
}
}
这是模型类
public class ListItem {
private String time;
private String description;
public ListItem(String time, String description) {
this.time = time;
this.description = description;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
这是适配器类
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private Context context;
private List<ListItem> listitem;
public MyAdapter(Context context, List listitems){
this.context = context;
this.listitem = listitems;
}
@NonNull
@Override
public MyAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_row, viewGroup, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyAdapter.ViewHolder viewHolder, int i) {
ListItem item = listitem.get(i);
viewHolder.time.setText(item.getTime());
viewHolder.description.setText(item.getDescription());
}
@Override
public int getItemCount() {
return listitem.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
public TextView time;
public TextView description;
public ViewHolder(@NonNull View itemView) {
super(itemView);
time = itemView.findViewById(R.id.time);
description = itemView.findViewById(R.id.description);
}
}
}
也许我需要在arrayList
中添加For循环,以便它可以显示所有项目?如果是这样,我怎么添加它。
答案 0 :(得分:1)
listItems.add(item)
仅添加 a 单个项目。
您的Adapter
实际上有效,只是您只添加了一项即可^^
答案 1 :(得分:0)
这是因为urarraylist每次都会重新创建。
答案 2 :(得分:0)
主要问题是当您尝试创建新事件并将数据存储在sharedPrefernce
中时。用您的方式,仅存储最后一个项目。当检索到数据时,您只有一个数据(最后一个)。如果要在列表中显示所有数据,则必须使用DB(用于保存数据),然后从DB中检索数据并显示。
或
您可以尝试使用此Tiny DB库。非常简单。
TinyDB tinydb = new TinyDB(context);
放置
tinydb.putList("MyUsers", mUsersArray);
获得
tinydb.getList("MyUsers");
答案 3 :(得分:0)
您仅在列表中添加一项。如果您要在recyclerview上放置多个物品,那么请将该行粘贴5次,如下所示:
listItems.add(item);
listItems.add(item);
listItems.add(item);
listItems.add(item);
listItems.add(item);
这将显示5个相同的项目列表。
答案 4 :(得分:0)
在加载您的Activity / Fragment时,onCreate()方法将仅被调用一次 。 并在onCreate()方法中....您调用了listItems.add(items){因此,它也会被调用一次,因此显示了来自共享Preferredeces中的一项}
您的问题:它仅显示最后一个用户的输入。 当您随后在编辑文本中输入内容并单击按钮时,最后的输入将被最新的输入取代(为什么是键-值对,即您修改了现有键的值)。下次当您的RecyclerView的“活动”打开时,它将加载最近更新的输入。
现在如何显示所有项目:
(如果您的要求是:重新打开应用程序后,所有以前的项目都应该存在)
->要么在共享首选项中为不同的输入维护单独的键,然后尝试将所有键检索到arraylist中(我不喜欢这样) ->使用SQLite进行存储,然后取回arraylist。
每次维护包含所有元素的arraylist