【问题标题】:ListView shows only One RowListView 仅显示一行
【发布时间】: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。所以只有列表会滚动,按钮是静态的,这不是预期的。不过,欢迎任何更好的方法来实现这一点。

标签: android listview


【解决方案1】:

也许我发现了你的问题,尝试删除 ScrollView 中的 listView 表单。您不应该将 ListView 放在 ScrollView 中,因为 ListView 类实现了自己的滚动,并且它只是不接收手势,因为它们都由父 ScrollView 处理。

如果您想在列表顶部显示某些内容,请使用标题,就像使用 listView.addHeader(yourlayour) 一样简单,看看这个post 来确定您的问题。

【讨论】:

    【解决方案2】:

    请试试这个。 改变getView方法如下

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
         view=convertView;
        ViewHolder holder;
    
        if (convertView == null) {
            view = layoutInflater.inflate(R.layout.config_list_row_layout, null);
            holder = new ViewHolder();
            holder.nameTextView = (TextView) view.findViewById(R.id.config_list_row_textView);
            holder.idTextView = (TextView) view.findViewById(R.id.config_list_row_id);
            view.setTag(holder);
    
        } else {
            holder = (ViewHolder) view.getTag();
        }
    
        ConfigEntity entity = entityList.get(position);
    
        holder.nameTextView.setText(entity.getName());
        holder.idTextView.setText(entity.getID());
    
        return view;
    }
    

    并声明视图视图;作为类级变量; 希望它有帮助谢谢。参考这里:-https://androidruler.wordpress.com/2016/02/21/android-custom-listview-example/

    【讨论】:

    • 此代码将因“convertView.findViewById(R.id.config_list_row_textView);”上的 NPE 而崩溃在这种情况下 (convertView == null)
    • @0X0nosugar 感谢您的纠正,我编辑了上面的帖子。
    • @JagjitSingh 不,它不会反映任何东西。
    猜你喜欢
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多