1

いくつかの値を持つスピナーがあり、Webサービスから入力します。

スピナーの充填

int i = 0;

var dropItems = new List<SpinItem2>();

DataRow[] result = myOPTvalues.Tables[0].Select("FieldValue=" + item.FieldValue);
foreach (DataRow row in result)
{
    var optItem = new PrevzemSpin();
    optItem.FieldValue = row["FieldValue"].ToString();
    if (optItem.FieldValue.Equals(""))
    optItem.FieldValue = null;

    optItem.FieldTextValue = row["FieldTextValue"].ToString();
    if (optItem.FieldTextValue.Equals(""))
    optItem.FieldTextValue = null;

    dropItems.Add(new SpinItem2(i, optItem.FieldValue.ToString(), optItem.FieldTextValue.ToString()));
            }

i = 1;
foreach (DataRow row in myOPTvalues.Tables[0].Rows)
{
    var optItem = new PrevzemSpin();
    optItem.FieldValue = row["FieldValue"].ToString();
    if (optItem.FieldValue.Equals(""))
    optItem.FieldValue = null;

    optItem.FieldTextValue = row["FieldTextValue"].ToString();
    if (optItem.FieldTextValue.Equals(""))
    optItem.FieldTextValue = null;


    if (optItem.FieldValue != item.FieldValue)
    {
        dropItems.Add(new SpinItem2(i, optItem.FieldValue.ToString(), optItem.FieldTextValue.ToString()));
    }
    ++i;
}

何らかの理由で、最初に挿入されたアイテムがデフォルトで「選択」され、次に選択されたものを送信するために使用するItemSelectedイベントをトリガーするように動作しますが、それは望ましくありません。

画面にこれらのスピナーがかなりあるため、アクティビティが非常に遅くなり、フィールドに誤った値が送信されます。また、ItemSelectを使用して、すべてが正常に行われたかどうかを検出します(たとえば、サービスが低下したか、値自体が変更されたとします)。ユーザーがフォームに入力している間、サーバー上(サーバーアプリケーションに新しいフィールドを追加した人など)

アクティビティの読み込みではなく実際のユーザーインタラクションでトリガーするようにアプリに指示する方法はありますか?

4

3 に答える 3

4

私はAndroidについて具体的に話すことはできませんが、Windowsでこれに何度も遭遇しました。

私が通常使用する解決策は、ブールloading変数を追加することです。初期化の最初にtrueに設定し、最後にクリアします。

このようなイベントハンドラーItemSelectedでは、初期ロードの結果としてこれがトリガーされているかどうかを簡単に確認できます。

private void onItemSelected(....)
{
    if(loading)
    {
        return; //Ignore as form is still loading
    }

    //Normal event handling logic goes here
    ....
 }
于 2013-02-11T08:19:37.033 に答える
1

明確にするために、アイテムが選択されるとイベントが発生します。セマンティクスには明らかに欠陥がありますが、技術的には、アイテムが選択されているスピナーにすぐに尋ねることができるため、最初にロードされたときにアイテムが選択されます。他の回答が言うように、最初に選択されたときは無視してください。ローディングを選択し、その後は通常どおり続行します。

于 2013-02-12T06:28:04.087 に答える
1

GetView を宣言する前に:

int LastSpinnerSelectedPosition;

私のスピナー定義の中で:

LastSpinnerSelectedPosition = 0;

私のスピナー ItemSelected イベント:

var CurrentSelectedIndex = SpinnerValue.SelectedItemPosition;

if (CurrentSelectedIndex != LastSpinnerSelectedPosition) 
{
    // WHATEVER I WANTED TO DO ON ITEM SELECT ANYWAY

    // Fix the LastSpinnerSelectedPosition ;)
    LastSpinnerSelectedPosition = CurrentSelectedIndex; 
}

シンプル;D

于 2013-02-12T06:25:41.157 に答える