我的问题是,如何用这三个步骤创建这个视图。小行、中行和包含表格的较大行
我不认为
ExpandableListView
从这个问题的描述来看,我认为每个项目仍然是一对一的关系
多级列表
在这里,您需要的是一个自定义适配器,带有用于项目视图的自定义适配器。
例如,首先创建数据模型:
public class MyDataModel
{
public string Name { get; set; }
public string Time { get; set; }
public string Location { get; set; }
public string Details { get; set; }
public bool isDone { get; set; }
}
public class MyLVAdapter : BaseAdapter<MyDataModel>
{
private List<MyDataModel> items = new List<MyDataModel>();
private Activity context;
public MyLVAdapter(Activity context, List<MyDataModel> items) : base()
{
this.context = context;
this.items = items;
}
public override MyDataModel this[int position]
{
get { return items[position]; }
}
public override int Count
{
get { return items.Count; }
}
public override long GetItemId(int position)
{
return position;
}
public override View GetView(int position, View convertView, ViewGroup parent)
{
View view = convertView; // re-use an existing view, if one is available
if (view == null)
{ // otherwise create a new one
view = context.LayoutInflater.Inflate(Resource.Layout.mycell, null);
}
TextView nametv = view.FindViewById<TextView>(Resource.Id.name);
TextView taltv = view.FindViewById<TextView>(Resource.Id.timeandlocation);
GridLayout layout = view.FindViewById<GridLayout>(Resource.Id.details);
TextView detailtime = view.FindViewById<TextView>(Resource.Id.detailtime);
TextView detailtv = view.FindViewById<TextView>(Resource.Id.detailtv);
nametv.Text = items[position].Name;
taltv.Text = "Time: " + items[position].Time + "Location: " + items[position].Location;
detailtime.Text = items[position].Time;
detailtv.Text = items[position].Details;
layout.Visibility = ViewStates.Gone;
if (items[position].isDone)
{
taltv.Visibility = ViewStates.Gone;
}
return view;
}
}
项目视图如下所示,您可以将其替换为自己的视图:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:id="@+id/name"
android:layout_height="wrap_content"
android:layout_width="match_parent" />
<TextView android:id="@+id/timeandlocation"
android:layout_height="wrap_content"
android:layout_width="match_parent" />
<GridLayout android:id="@+id/details"
android:layout_height="100dp"
android:layout_width="match_parent"
android:rowCount="1"
android:columnCount="2">
<TextView android:id="@+id/detailtime"
android:layout_height="wrap_content"
android:layout_width="wrap_content" />
<TextView android:id="@+id/detailtv"
android:layout_height="wrap_content"
android:layout_width="wrap_content" />
</GridLayout>
</LinearLayout>
我在活动中做了一些虚假的测试数据:
public List<MyDataModel> list;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
list = new List<MyDataModel>();
for (int i = 0; i < 30; i++)
{
if (i % 5 == 0)
list.Add(new MyDataModel
{
Name = "Name " + i,
Details = "Details " + i,
Location = "Location " + i,
Time = "Time " + i,
isDone = true
});
else
{
list.Add(new MyDataModel
{
Name = "Name " + i,
Details = "Details " + i,
Location = "Location " + i,
Time = "Time " + i,
isDone = false
});
}
}
ListView lv = (ListView)FindViewById(Resource.Id.lv);
lv.Adapter = new MyLVAdapter(this, list);
lv.ItemClick += MListView_ItemClick;
}
private void MListView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
{
var view1 = e.View.FindViewById<TextView>(Resource.Id.timeandlocation);
var view2 = e.View.FindViewById<GridLayout>(Resource.Id.details);
if (view2.Visibility == ViewStates.Gone)
{
view1.Visibility = ViewStates.Gone;
view2.Visibility = ViewStates.Visible;
}
else
{
if (!list[e.Position].isDone)
view1.Visibility = ViewStates.Visible;
view2.Visibility = ViewStates.Gone;
}
}