具有自定义视图的ListView仅显示一个元素

时间:2012-09-18 09:07:47

标签: android-layout android-listview

我有AlertDialog我从这个布局中膨胀:

<?xml version="1.0" encoding="utf-8"?>    
    <ListView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/List"
        android:layout_alignParentTop="true"
        android:layout_width="match_parent"
        android:layout_height="400dp"/>

我需要列表中的每个项目都是由此描述的视图 XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#20f0f0f0"
    android:orientation="horizontal" >

    <CheckBox 
        android:layout_gravity="center_vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:id="@+id/cb_persistent"/>

    <TextView
        style="@style/Label"
        android:layout_gravity="center_vertical"
        android:gravity="center_horizontal|center_vertical"
        android:layout_width="fill_parent"
        android:layout_height="@dimen/button_height"
        android:layout_toLeftOf="@+id/btn_connect"
        android:layout_toRightOf="@+id/cb_persistent"
        android:id="@+id/lbl_name_address"/>

    <Button
        android:layout_gravity="center_vertical" 
        style="@style/Button.Plain"
        android:layout_width="wrap_content"
        android:layout_alignParentRight="true"
        android:id="@+id/btn_connect"
        android:text="@string/Connect"/>
</RelativeLayout>

这是我正在尝试使用的适配器。我也试过实现ListAdapter,结果是一样的:只显示1个列表行,对话框正好是1行高。使用此适配器,它是最后一行,ListAdapter - 第一行。我做错了什么?

private class ListItem extends View {

        public ListItem(Context context) {
            super(context);
            View content = ((LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.list_element, null);
            setView(content);

            m_cbPersistent = (CheckBox) content.findViewById(R.id.cb_persistent);
            m_btnConnect   = (Button)   content.findViewById(R.id.btn_connect);
            m_lblName      = (TextView) content.findViewById(R.id.lbl_name_address);
        }

        public CheckBox m_cbPersistent = null;
        public Button   m_btnConnect   = null;
        public TextView m_lblName      = null;
    }

class NewAdapter extends ArrayAdapter<ListItem> 
    {

        public NewAdapter(Context context) {
            super(context, 0);
            m_context = context;
        }

        @Override
        public int getCount() {
            return m_items.size();
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (position < getCount())
                return m_items.elementAt(position);
            else
                return null;
        }

        void addNewItem ()
        {
            m_items.add(new NetworkCameraEntry(m_context));
        }

        void removeItem (int index)
        {
            if (index < getCount())
            {
                m_items.remove(index);
            }
        }

        @Override
        public boolean isEmpty() {
            return m_items.size() <= 0;
        }

        @Override
        public boolean areAllItemsEnabled() {
            return true;
        }

        @Override
        public boolean isEnabled(int position) {
            return true;
        }

            private Context m_context = null;

        private Vector<ListItem> m_items = new Vector<ListItem>();
    }

这是我在AlertDialog的构造函数中初始化它的方式:

public class MyDialog extends AlertDialog {

public MyDialog(Context context) {
        super(context, 0);

        View content = ((LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.network_cameras_list_window, null);
        setView(content);

        m_adapter = new NewAdapter(context);
        m_list = (ListView) content.findViewById(R.id.List);
        m_list.setAdapter(m_adapter);   

        m_adapter.addNewItem();

        m_adapter.addNewItem();
    }

    private ListView m_list = null;
    private NewAdapter m_adapter = null;
}

1 个答案:

答案 0 :(得分:1)

构造适配器时,

m_items.size为1并随着时间的推移而填充。 缓存m_items.size,因此您必须在每个m_items.add

上使适配器无效

然而,这不是要走的路。 更好的选择是在构建适配器之前填充数据并将密码传递给适配器。使用

更改适配器的notify / invalidate所需的任何数据
notifyDataSetInvalidated();
notifyDataSetChanged();