奇怪的CheckedTextView行为

时间:2013-03-28 13:23:21

标签: android gridview android-fragments xamarin.android

好的,忍受我这是一个非常奇怪的&复杂的问题,我很难解释它。我正在使用Xamarin.Android(Monodroid),虽然问题的根源可能是一个安卓系统。

我有一个Activity,通过添加和删除它们来手动翻阅片段。

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,并修改正确的数据。
  • 已验证为正确的GridView调用了NotifyDataSetChanged()

我个人难以接受这个。

0 个答案:

没有答案