【发布时间】:2016-02-23 10:45:15
【问题描述】:
我有一个简单的列表,假设显示数据库表中的所有行。但是,它在列表视图中只显示一行。
虽然,它从 DB 接收所有行(验证 configArrayList 的大小),但只显示第一行并丢弃其他行。
这是活动和自定义适配器。
主要活动:
ArrayList<HashMap<String, String>> configArrayList = dbTools.getAllConfig(); // Returns 4 rows
ArrayList<ConfigEntity> configMenu = new ArrayList<>();
if (!(configArrayList.isEmpty()))
{
Iterator<HashMap<String, String>> iterator = configArrayList.iterator();
while (iterator.hasNext())
{
HashMap<String, String> configMap = iterator.next();
// ConfigEntity contains two members Name, ID and their setter, getter
ConfigEntity entity = new ConfigEntity();
entity.setID(configMap.get("ID"));
entity.setName(String.valueOf(configArrayList.size()));
// Set Name as Size to verify the list size is grater than 1. (Size is 4)
configMenu.add(entity);
}
}
if (!(configMenu.isEmpty()))
{
ListAdapter adapter = new ConfigListAdapter(this, configMenu);
ListView theListView = (ListView) findViewById(R.id.config_list_listView);
theListView.setAdapter(adapter);
}
这是自定义适配器:
public class ConfigListAdapter extends BaseAdapter {
private ArrayList<ConfigEntity> entityList;
private LayoutInflater layoutInflater;
public ConfigListAdapter(Context context, ArrayList<ConfigEntity> entityList) {
this.entityList = entityList;
layoutInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return entityList.size();
}
@Override
public Object getItem(int position) {
return entityList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.config_list_row_layout, null);
holder = new ViewHolder();
holder.nameTextView = (TextView) convertView.findViewById(R.id.config_list_row_textView);
holder.idTextView = (TextView) convertView.findViewById(R.id.config_list_row_id);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
ConfigEntity entity = entityList.get(position);
holder.nameTextView.setText(entity.getName());
holder.idTextView.setText(entity.getID());
return convertView;
}
static class ViewHolder {
TextView nameTextView;
TextView idTextView;
}
}
main_activity.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add New"
android:id="@+id/config_list_addConfig_button"
android:layout_gravity="right"
android:onClick="addNewConfig" />
<ListView
android:id="@+id/config_list_listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:dividerHeight="5dp">
</ListView>
</LinearLayout>
</ScrollView>
config_list_listView.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="@dimen/margin_20dp">
android:layout_marginRight="@dimen/margin_20dp">
<TextView
android:id="@+id/config_list_row_textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:layout_marginTop="@dimen/margin_10dp"
android:layout_marginLeft="@dimen/margin_20dp"
android:longClickable="true" />
<TextView
android:id="@+id/config_list_row_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone" />
</LinearLayout>
【问题讨论】:
-
能分享一下你的xml里面有listview吗?
-
我知道您正在使用大小来确保您拥有数据,但是当您将其传递给列表时,您能否打印出您在 configMenu 中拥有的内容以 100% 确定问题不存在?
-
@Spirrow 理想情况下 ConfigMenu 应该具有相同的数据。但是,根据您的建议,我已经验证了该列表中的数据。一切看起来都很好。 (它包含 ConfigEntity 的对象列表,每个 ConfigEntity 对象保存从 DB 的每一行获取的数据)。
-
是否有理由将 ListView 放在 ScrollView 中?我认为这是不好的做法。 getCount() 在您的 ConfigListAdapter 中返回什么?
-
@JasonSaruulo 我理解你的担忧,我知道这一点。但我希望页面顶部的按钮应该随着列表内容滚动。如果我将列表放在 ScrollView 之外,它会将页面分成两部分,顶部仅包含 Button,底部包含 listView。所以只有列表会滚动,按钮是静态的,这不是预期的。不过,欢迎任何更好的方法来实现这一点。