我有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;
}
答案 0 :(得分:1)
m_items.size
为1并随着时间的推移而填充。
缓存m_items.size
,因此您必须在每个m_items.add
然而,这不是要走的路。 更好的选择是在构建适配器之前填充数据并将密码传递给适配器。使用
更改适配器的notify
/ invalidate
所需的任何数据
notifyDataSetInvalidated();
notifyDataSetChanged();