1

わかりました、これは非常に奇妙で複雑な問題であり、説明するのに苦労しています。私は Xamarin.Android (Monodroid) を使用していますが、問題の原因は Android にある可能性があります。

フラグメントを追加および削除することにより、フラグメントを手動でページングするアクティビティがあります。

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 があり、実行時に Row Views が取り込まれます。(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 が含まれています。(グリッドビューはスクロールしません)

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 を選択した場合、すべてのグリッド ビューが選択肢 2 の選択に変わります)

私は持っている:

  • 基になるデータが正しいことを確認しました
  • .GetHash()CheckedTextViews、GridViews、および Adapters のすべてが、指定された行に対して一意であることを確認しました。
  • タッチが正しい CheckedTextViews に伝播し、正しいデータを変更することを確認しました。
  • NotifyDataSetChanged()が正しい GridView に対して呼び出されることを確認しました。

私は個人的にこれをガンガンするのに困惑しています。

4

0 に答える 0