RecyclerView отображает только последний элемент

Я хочу отображать ввод всех пользователей в 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 добавьте только один элемент, поэтому он показывает одну строку.

Hemant Parmar 20.08.2018 11:18

Что вы имеете в виду под "всеми пользователями", где вы храните список пользователей

Ümañg ßürmån 20.08.2018 11:48

добавить больше данных с помощью цикла, теперь он отображает одну запись, потому что добавлена ​​только одна запись (из вашего кода listItems.add (item);)

Arbaz.in 21.08.2018 08:36
0
3
1 842
5

Ответы 5

listItems.add(item) добавляет только один элемент а.

Ваш Adapter действительно работает, просто вы добавляете к нему только один элемент ^^

Как я могу добавить в него дополнительные элементы, следует ли использовать For Loop? И как я могу это сделать?

guanwen yan 21.08.2018 07:35

Это другой вопрос, но основной. Я просто описал, в чем дело. Да, вы можете использовать цикл, но я мало что знаю о том, что вы пытаетесь сделать с показанным вами кодом. На данный момент вы добавляете только один элемент: ListItem item = new ListItem(timeInfo, descriptionInfo), и это была ваша проблема.

shkschneider 21.08.2018 09:53

Это потому, что 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 каждый раз со всеми элементами

Другие вопросы по теме