1

LinearLayoutを拡張するカスタムコントロールを作成しています。そのコントロール内では、スピナーを使用して、ユーザーがリストからアイテムを選択できるようにしています。私が抱えている問題は、OnItemSelectedListenerイベントが発生しないことです。同じコードをアクティビティ/フラグメントに移動すると、すべてが正常に機能します。

私は同じ問題について尋ねる他の人に与えられたいくつかの答えに従いました、そして何も助けにはなりませんでした。それでもイベントは発生しません。

これは、コードではなくレイアウトXML内にスピナーを配置することを提案した回答に従った後の私のコードです。「新しいスピナー(ctx)」だけを試しても同じ結果が得られます...

レイアウトXML:

  <Spinner
    android:id="@+id/accSpinner"        
    android:layout_width="0dip"
    android:layout_height="0dip" />

コントロールの初期化関数(コントロールコンストラクターで呼び出されます):

private void init()
{
    LayoutInflater layoutInflater = LayoutInflater.from(mContext);
    mAccountBoxView = layoutInflater.inflate(R.layout.control_accountselector, null);

    mTxtAccount = (TextView)mAccountBoxView.findViewById(R.id.txtAccount);
    mSpinner = (Spinner)mAccountBoxView.findViewById(R.id.accSpinner);

    mAccountBoxView.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                mSpinner.performClick();
            }
        });

    setSpinner();
    addView(mAccountBoxView);
}

private void setSpinner()
{       
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(mContext, android.R.layout.simple_spinner_item, mItems);
    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);             
    mSpinner.setAdapter(dataAdapter);

    mSpinner.setOnItemSelectedListener(new OnItemSelectedListener()
        {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
            {
                String selectedItem = mItems.get(position);
                handleSelectedItem(selectedItem);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent)
            {

            }
        });     
}

コントロールに触れるとスピナーがうまく上がり、アイテムのリストが表示されます。アイテムをクリックするとスピナーは閉じますが、onItemSelectedにもonNothingSelectedにもアクセスできません。

何か案は?

4

1 に答える 1

1

答えが見つかりました!

アイテムの空の配列リストを使用してスピナーアダプターを初期化しました。次に、このパブリック関数を使用して実際のアイテムが追加されました。

public void addItem(String item)
{
    mItems.add(item);       
}

関数を次のように変更しました。

public void addItem(String item)
{
    mItems.add(item);
    mDataAdapter.notifyDataSetChanged();
}

これで、アダプターは新しいアイテムを認識し、イベントが発生します。

コードをアクティビティに移動したとき、外部から呼び出すものがなかったため、アダプターを設定する前にアイテムが配列に含まれていたため、そこで機能しました。

于 2012-11-04T22:57:49.907 に答える