解决EditText内容添加至ListView时覆盖历史数据及横向展示问题
解决ListView数据覆盖及横向展示问题
我来帮你搞定这两个问题!先看看你代码里的核心问题,再一步步解决:
一、为什么数据会被覆盖?
你的代码每次点击按钮时,都会新建一个List和ArrayAdapter,这就导致之前添加的数据被完全丢弃了。要保留历史数据,必须把List和Adapter变成类的成员变量,只初始化一次,每次点击只往已有List里加数据。
修复数据覆盖的基础代码
先把数据保存的问题解决,这是核心:
public class secondActivity extends AppCompatActivity { EditText edit1, edit2, edit3; Button button; ListView listView; // 把List和Adapter声明为成员变量,让它们存活整个Activity生命周期 private List<String> itemList; private ArrayAdapter<String> listAdapter; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second); edit1 = findViewById(R.id.name); edit2 = findViewById(R.id.desigination); edit3 = findViewById(R.id.post); listView = findViewById(R.id.list_view); button = findViewById(R.id.list_button); // 只初始化一次List和Adapter itemList = new ArrayList<>(); listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, itemList); listView.setAdapter(listAdapter); button.setOnClickListener(new View.OnClickListener() { @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) @Override public void onClick(View v) { // 获取三个输入框的内容,合并成一条数据(也可以分开存,这里方便展示) String name = edit1.getText().toString().trim(); String designation = edit2.getText().toString().trim(); String post = edit3.getText().toString().trim(); // 非空判断,避免添加空数据 if (!name.isEmpty() && !designation.isEmpty() && !post.isEmpty()) { String combinedItem = name + " | " + designation + " | " + post; itemList.add(combinedItem); // 通知Adapter数据更新,ListView会自动刷新显示新内容 listAdapter.notifyDataSetChanged(); // 清空输入框 edit1.setText(""); edit2.setText(""); edit3.setText(""); } } }); } }
现在点击按钮,数据会不断添加到List里,不会再覆盖旧内容了。
二、实现横向展示
ListView本身是垂直滚动的组件,要实现横向布局有两种方案,我更推荐第二种(更现代灵活):
方案1:用HorizontalScrollView包裹ListView(快速实现)
修改你的布局文件second.xml,把ListView放在HorizontalScrollView里,同时自定义每个列表项的横向布局:
- 创建横向列表项布局
list_item_horizontal.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="8dp"> <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:marginEnd="16dp"/> <TextView android:id="@+id/tv_designation" android:layout_width="wrap_content" android:layout_height="wrap_content" android:marginEnd="16dp"/> <TextView android:id="@+id/tv_post" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>
- 替换布局里的ListView:
<HorizontalScrollView android:layout_width="match_parent" android:layout_height="wrap_content"> <ListView android:id="@+id/list_view" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </HorizontalScrollView>
- 自定义Adapter替换原来的ArrayAdapter(参考前面的CustomAdapter代码),这样每个列表项是横向排列的,整个列表可以横向滚动。
方案2:用RecyclerView实现横向布局(推荐)
RecyclerView是官方推荐替代ListView的组件,原生支持横向布局,性能也更好:
- 先在
build.gradle添加依赖:
dependencies { implementation 'androidx.recyclerview:recyclerview:1.3.2' }
- 修改布局文件
second.xml,替换ListView为RecyclerView:
<androidx.recyclerview.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content"/>
- 创建横向列表项布局
item_horizontal.xml(和方案1的list_item_horizontal一样)。 - 编写RecyclerView的Adapter:
public class HorizontalItemAdapter extends RecyclerView.Adapter<HorizontalItemAdapter.ViewHolder> { private List<Item> itemList; public HorizontalItemAdapter(List<Item> itemList) { this.itemList = itemList; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_horizontal, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { Item item = itemList.get(position); holder.tvName.setText(item.getName()); holder.tvDesignation.setText(item.getDesignation()); holder.tvPost.setText(item.getPost()); } @Override public int getItemCount() { return itemList.size(); } public static class ViewHolder extends RecyclerView.ViewHolder { TextView tvName, tvDesignation, tvPost; public ViewHolder(@NonNull View itemView) { super(itemView); tvName = itemView.findViewById(R.id.tv_name); tvDesignation = itemView.findViewById(R.id.tv_designation); tvPost = itemView.findViewById(R.id.tv_post); } } } // 用实体类存储三个字段,更规范 public class Item { private String name; private String designation; private String post; public Item(String name, String designation, String post) { this.name = name; this.designation = designation; this.post = post; } public String getName() { return name; } public String getDesignation() { return designation; } public String getPost() { return post; } }
- 修改Activity代码:
public class secondActivity extends AppCompatActivity { EditText edit1, edit2, edit3; Button button; RecyclerView recyclerView; private List<Item> itemList; private HorizontalItemAdapter adapter; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second); edit1 = findViewById(R.id.name); edit2 = findViewById(R.id.desigination); edit3 = findViewById(R.id.post); recyclerView = findViewById(R.id.recycler_view); button = findViewById(R.id.list_button); itemList = new ArrayList<>(); // 设置横向布局管理器 LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false); recyclerView.setLayoutManager(layoutManager); adapter = new HorizontalItemAdapter(itemList); recyclerView.setAdapter(adapter); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String name = edit1.getText().toString().trim(); String designation = edit2.getText().toString().trim(); String post = edit3.getText().toString().trim(); if (!name.isEmpty() && !designation.isEmpty() && !post.isEmpty()) { itemList.add(new Item(name, designation, post)); // 通知Adapter插入了新数据,比notifyDataSetChanged更高效 adapter.notifyItemInserted(itemList.size() - 1); edit1.setText(""); edit2.setText(""); edit3.setText(""); } } }); } }
现在RecyclerView会横向排列所有添加的内容,每次点击按钮都会在末尾新增一条数据,完美满足你的需求!
内容的提问来源于stack exchange,提问作者Sunny
相关产品推荐
相关产品推荐

