Я хочу отображать ввод всех пользователей в 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);
}
}
}
Может быть, мне нужно добавить цикл For в arrayList, чтобы он мог отображать все элементы? И если да, то как его добавить.
Что вы имеете в виду под "всеми пользователями", где вы храните список пользователей
добавить больше данных с помощью цикла, теперь он отображает одну запись, потому что добавлена только одна запись (из вашего кода listItems.add (item);)
listItems.add(item) добавляет только один элемент а.
Ваш Adapter действительно работает, просто вы добавляете к нему только один элемент ^^
Как я могу добавить в него дополнительные элементы, следует ли использовать For Loop? И как я могу это сделать?
Это другой вопрос, но основной. Я просто описал, в чем дело. Да, вы можете использовать цикл, но я мало что знаю о том, что вы пытаетесь сделать с показанным вами кодом. На данный момент вы добавляете только один элемент: ListItem item = new ListItem(timeInfo, descriptionInfo), и это была ваша проблема.
Это потому, что ur arraylist создает каждый раз заново.
Основная проблема - когда вы пытаетесь создать новое событие, а данные хранятся в sharedPrefernce. По-вашему сохраняется только последний элемент. И когда данные получены, у вас есть только одни данные (последние). Если вы хотите отобразить все данные в списке, вам нужно использовать БД (для сохранения данных), а затем получить данные из БД и показать.
Или
Вы можете попробовать эту библиотеку Крошечная БД. Все очень просто.
TinyDB tinydb = new TinyDB(context);
класть
tinydb.putList("MyUsers", mUsersArray);
получить
tinydb.getList("MyUsers");
Вы добавляете только один элемент в список. Если вы хотите, чтобы в recyclerview было несколько элементов, вставьте эту строку 5 раз следующим образом:
listItems.add(item);
listItems.add(item);
listItems.add(item);
listItems.add(item);
listItems.add(item);
это покажет список 5 одинаковых элементов.
Поскольку метод onCreate () будет называться только однажды при загрузке вашего Activity / Fragment ... и внутри вашего метода onCreate () .... вы вызвали listItems.add (items) {Таким образом, он также будет вызван один раз, таким образом показывая один элемент из общих предпочтений}
ваш вопрос: он показывает только последний ввод пользователя. После того, как вы введете ввод в текст редактирования и нажмете кнопку, ваши последние вводы будут заменены последними вводами (почему? Пара ключ-значение, т.е. вы изменили значение для существующего ключа). И в следующий раз, когда откроется Activity RecyclerView, он загрузит последние обновленные входные данные.
Теперь, как вы можете показать все предметы:
(если ваше требование: после повторного открытия приложения все предыдущие элементы должны быть там)
-> Либо поддерживайте отдельные ключи в общих настройках для разных входов, затем попробуйте получить все в Arraylist (мне это не нравится) -> Использовать SQLite для хранения, а затем получить обратно в arraylist.
Поддерживайте Arraylist каждый раз со всеми элементами
в вашем
listItemsдобавьте только один элемент, поэтому он показывает одну строку.