如何在Fragment中向ListView传数据?数据分属单元格问题
解决ListView单单元格显示多条数据库数据的问题
问题原因
你当前的代码在遍历数据库游标时,把每一列的数据单独添加到listItem集合中,导致ArrayAdapter将每个字符串视为独立的列表项,最终每条数据占据一个单元格。
快速修复方案
修改viewData方法中的循环逻辑,将同一行的两列数据拼接成一个字符串后再添加到集合,这样单个列表项就包含两条数据,对应ListView的一个单元格:
private void viewData(){ Cursor cursor=db.viewData(); if(cursor.getCount() == 0) { Toast.makeText(getContext(),"No data to show",Toast.LENGTH_LONG).show(); }else{ while (cursor.moveToNext()){ // 将两列数据合并为一个字符串,可自定义分隔样式(比如换行、空格等) String combinedContent = cursor.getString(1) + "\n" + cursor.getString(2); listItem.add(combinedContent); } } adapter = new ArrayAdapter(getContext(),android.R.layout.simple_list_item_1,listItem); listweight.setAdapter(adapter); }
进阶优化(自定义布局)
如果需要更美观的排版(比如两列独立样式、对齐),可以自定义列表项布局:
- 创建布局文件
res/layout/list_item_weight.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="12dp"> <TextView android:id="@+id/tv_first_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="16sp" android:textStyle="bold"/> <TextView android:id="@+id/tv_second_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="14sp" android:textColor="@android:color/darker_gray"/> </LinearLayout>
- 使用自定义Adapter替换原有的
ArrayAdapter(这里以BaseAdapter为例):
// 替换原adapter初始化代码 adapter = new BaseAdapter() { @Override public int getCount() { return listItem.size(); } @Override public Object getItem(int position) { return listItem.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item_weight, parent, false); } TextView tvFirst = convertView.findViewById(R.id.tv_first_data); TextView tvSecond = convertView.findViewById(R.id.tv_second_data); // 拆分合并的字符串,或者建议改用自定义数据类存储(更规范) String[] dataParts = listItem.get(position).split("\n"); tvFirst.setText(dataParts[0]); tvSecond.setText(dataParts[1]); return convertView; } }; listweight.setAdapter(adapter);
更规范的做法是创建一个数据实体类(比如WeightRecord)来存储每行的两个字段,再用ArrayList<WeightRecord>作为数据源,这样后续维护更方便。
内容的提问来源于stack exchange,提问作者netti169
相关产品推荐
相关产品推荐

