RecyclerView仅显示最后一个项目

时间:2018-08-20 09:16:10

标签: android android-recyclerview android-edittext sharedpreferences recycler-adapter

我想在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循环,以便它可以显示所有项目?如果是这样,我怎么添加它。

5 个答案:

答案 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