我有一个带有一些EditTexts的UI,这组edittexts可以根据列表中的项目数重复次数(不是太多,但最多3到10次)。
用户可以编辑/修改/删除项目或编辑编辑文本的值。目前我正在使用“AddView / RemoveView”手动执行此操作,手动处理状态等,但是由于我有许多这样的场景,所以这是很多工作。
我们有一个具有相同功能的网络应用程序,我们正在使用AngularJS来处理所有这些,正如您所知,这非常容易。
是否有更紧密的方法将axml / xml视图与一个集合(可能是一个Observable集合,至少来自后面的代码)绑定在一起,它将处理集合更改以及单个字段更改,而无需执行所有操作这个手动。在某些情况下,我也必须显示图像。
此外,我尝试使用ListView,但它无法正常工作。
答案 0 :(得分:1)
是否有更紧密的方法将axml / xml视图与一个集合(可能是一个Observable集合,至少来自后面的代码)绑定在一起,它将处理集合更改以及单个字段更改,而无需执行所有操作这是手动。
答案是否定,没有。 Android的视图必须在创建时绑定到某些上下文/活动。它们不能被隔离,因此添加/删除EditText
必须由您自己实现。
目前,最接近您要求的方法是创建ObservableCollection
并监听CollectionChanged
事件,并在CollectionChanged
添加/删除容器中的视图时:
[Activity(Label = "Demo", MainLauncher = true)]
public class MainActivity : Activity
{
Button btnAdd;
ObservableCollection<View> oc;
LinearLayout container;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main);
btnAdd = FindViewById<Button>(Resource.Id.btnAdd);
btnAdd.Click += BtnAdd_Click;
GenerateET(Resource.Id.container, this, 3);
}
private void BtnAdd_Click(object sender, System.EventArgs e)
{
EditText et = new EditText(this);
et.Text = "test";
et.LayoutParameters = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent);
oc.Add(et);
}
public void GenerateET(int resId, Activity activity,int num)
{
//create an observable collection
oc = new ObservableCollection<View>();
container = activity.FindViewById<LinearLayout>(resId);
for (int i = 0; i < num; i++)
{
EditText et = new EditText(activity);
et.Text = "test";
et.LayoutParameters = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent);
container.AddView(et);
oc.Add(et);
}
oc.CollectionChanged += Oc_CollectionChanged;
}
private void Oc_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
{
for (int i = 0; i < e.NewItems.Count; i++)
{
//add the view manually
container.AddView((View)e.NewItems[i]);
}
}
}
}
Main.axml:
<?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">
<LinearLayout
android:orientation="vertical"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</LinearLayout>
<Button
android:id="@+id/btnAdd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Add EditText"/>
</LinearLayout>