好的,请耐心等待这是一个非常奇怪和复杂的问题,我很难解释它。我正在使用 Xamarin.Android (Monodroid) 虽然问题的根源可能是 android 的东西。
我有一个 Activity,它通过添加和删除 Fragments 来手动分页。
next = Fragments[nextIndex];
FragmentTransaction ftx = FragmentManager.BeginTransaction ();
ftx.SetTransition (FragmentTransit.FragmentFade);
ftx.SetCustomAnimations (Resource.Animator.slide_in_right, Resource.Animator.slide_out_left);
ftx.Remove (CurrentFragment);
ftx.Add (Resource.Id.fragmentContainer, next, next.Tag);
ftx.Commit();
Fragments 有一个 LinearLayout,它在运行时填充了行视图。(ListViews 在验证文本输入时引入了太多焦点问题)。
// Manual ListView
this.Layout.RemoveAllViewsInLayout ();
for (int n = 0; n < Adapter.Count; n++)
{
View view = Adapter.GetView(n,null,Layout);
if (view != null) {
if (view.Parent != Layout) {
Layout.AddView(view);
}
}
}
其中一些行视图中有一个 GridView。(gridview 不滚动)
TextView title = view.FindViewById<TextView>(Resource.Id.titleView);
GridView grid = view.FindViewById<GridView>(Resource.Id.gridView);
if (grid.Adapter == null) {
InlineAdapter adapter = new InlineAdapter(view.Context, list, this.Adapter);
// Set Grid's parameters
grid.Adapter = adapter;
grid.OnItemClickListener = adapter;
grid.SetNumColumns(adapter.GetColumns(((Activity)view.Context).WindowManager));
grid.StretchMode = StretchMode.StretchColumnWidth;
}
grid.ClearChoices();
// Get Current Value(s)
if (list.Mode == ListMode.SingleSelection)
{
grid.ChoiceMode = ChoiceMode.Single;
for (int b = 0; b < list.Selections.AllItems.Count; b++)
{
grid.SetItemChecked(b, false);
}
grid.SetItemChecked(list.GetSelectedIndex(DataStore), true);
}
网格视图中有 CheckedTextViews(单选或多选)。
// From "InlineAdapter"
public override View GetView(int position, View convertView, ViewGroup parent)
{
GridView grid = ((GridView)parent);
int layout = (list.Mode == ListMode.MultiSelection) ? Resource.Layout.RowListInclusive : Resource.Layout.RowListExclusive;
CheckedTextView view = (CheckedTextView)convertView;
if (view == null)
{
view = (CheckedTextView)inflator.Inflate(layout, parent, false);
}
view.Text = items[position];
// Calabash
view.ContentDescription = list.ContentDescription + "." + Selections.ContentDescription(items [position]);
return view;
}
当一个片段第一次出现时(在它被删除之前),一切都按预期执行。
当片段第二次和后续出现时(在它被删除和重新添加之后),只有最后一个网格视图接受用户输入。此外,在最后一个网格视图上选择的所有网格视图都选择。(例如,如果最后一个选择选项 2,则所有网格视图都更改为选择选项 2)
我有:
- 验证基础数据是否正确
- 使用
.GetHash()
所有 CheckedTextViews、GridViews 和 Adapters 对其给定行进行验证。 - 验证触摸传播到正确的 CheckedTextViews,并修改正确的数据。
- 已验证
NotifyDataSetChanged()
调用正确的 GridView。
我个人很难理解这一点。