自定义控件中的Android微调器 - OnItemSelectedListener不会触发

时间:2012-11-04 22:32:28

标签: java android android-layout

我正在编写一个扩展LinearLayout的自定义控件。在该控件内部,我使用微调器让用户从列表中选择一个项目。 我遇到的问题是OnItemSelectedListener事件不会触发。将相同的代码移动到Activity / Fragment时,一切正常。

我已经听过一些答案,这些答案是针对其他人提出同样问题的,并没有任何帮助。事件仍然没有发生。

在我按照建议将微调器放在我的布局XML而不是代码中的答案之后,这是我的代码。当我尝试“新的Spinner(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 ..

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

找到了答案!

我已经使用空的arraylist项初始化了微调器适配器。然后使用此公共函数添加实际项目:

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

我已将功能更改为:

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

现在适配器知道新项目并且事件被触发。

当我将代码移动到一个活动时,没有什么可以从外部调用它,所以在我设置适配器之前,这些项目都在数组中,这就是它在那里工作的原因。