在Fragment中为Spinner设置setOnItemSelectedListener

6

我在setOnItemSelectedListener中遇到了这个错误:

类型AdapterView中的方法setOnItemSelectedListener(AdapterView.OnItemSelectedListener)对于参数(FragmentMain)不适用

片段类:

public class FragmentMain extends Fragment  {

private Spinner countriesSpinner;
private Activity rootView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){
     View rootView =inflater.inflate(R.layout.activity_main, container, false);
     return rootView;
}
@Override
public void onStart() {
    super.onStart();

    addItemsOnSpinner();
}
public void addItemsOnSpinner() {

    countriesSpinner = (Spinner) rootView.findViewById(R.id.team_list_spinner);
    countriesSpinner.setOnItemSelectedListener(new  CustomOnItemSelectedListener ()) ;

    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(),
            R.array.team_list, android.R.layout.simple_spinner_item);

    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    countriesSpinner.setAdapter(adapter);

    countriesSpinner.setOnItemSelectedListener(this);

    }

public class CustomOnItemSelectedListener extends Activity implements
OnItemSelectedListener {

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int pos,
            long id)  {
        // TODO Auto-generated method stub
        if (parent.getItemAtPosition(pos).toString()
                .equals("San Antonio Spurs")) {
            Intent i = new Intent(getApplicationContext(), Spurs_games.class);
            startActivity(i);
            finish();}
        if (parent.getItemAtPosition(pos).toString()
                .equals("Los Angeles Lakers")) {
            Intent i = new Intent(getApplicationContext(), Lakers_games.class);
            startActivity(i);
            finish();}
    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub

    }

}

public void onItemSelected(AdapterView<?> parent, View view, int pos,
        long id) {
    if (parent.getItemAtPosition(pos).toString()
            .equals("San Antonio Spurs")) {
        Intent i = new Intent(getActivity(), Spurs_games.class);
        startActivity(i);
        finish();}
    if (parent.getItemAtPosition(pos).toString()
            .equals("Los Angeles Lakers")) {
        Intent i = new Intent(getActivity(), Lakers_games.class);
        startActivity(i);
        finish();}
}

private void finish() {
    // TODO Auto-generated method stub

}
public void onNothingSelected(AdapterView<?> arg0) {
    // TODO Auto-generated method stub

}
}  

这是我在这里的第一篇文章,请谅解/纠正我。 抱歉我的英语不好。
2个回答

19
setOnItemSelectedListener

如果你想在Fragment内使用Spinner监听器,则必须在FragmentMain中实现,而不是在Activity中实现。

FragmentMain的onCreateView方法中实现。

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
...
}

放置这段代码

countriesSpinner = (Spinner) rootView.findViewById(R.id.team_list_spinner);
countriesSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            public void onItemSelected(AdapterView<?> parent, View view,
                                       int position, long id) {
            }

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

            }
        });

如何在FragmentMain中实现setOnItemSelectedListener? - Mounir Elfassi
你需要将发布的代码放在 View rootView =inflater.inflate(R.layout.activity_main, container, false); 之后,return rootView; 之前。 - Silverstorm
1
现在代码可以工作了,但是当我点击下拉列表中的项目时,它不会启动活动。 - Mounir Elfassi
好的,现在我知道我做错了什么...谢谢Silverstorm。 - Mounir Elfassi

0
问题出在这一行代码:
countriesSpinner.setOnItemSelectedListener(this);

因为在您的情况下,“this”指的是Fragment,但您应该传递一个OnItemSelectedListener对象。

此外,关于监听器的工作方式似乎存在相当大的混淆。您可能希望在Fragment中实现OnItemSelectedListener,而不是创建那个CustomOnItemSelectedListener Activity。或者可以创建一个匿名的OnItemSelectedListener:

    countriesSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> parent, View view,
                int position, long id) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
            // TODO Auto-generated method stub

        }
    });

我理解了,但是在我的代码中如何通过OnItemSelectedListener对象传递呢?谢谢您的快速回答。 - Mounir Elfassi
好的,我添加了一个实现它的示例(作为匿名类)。 - donfuxx
错误发生在:FragmentMain.onStart(FragmentMain.java:31)。 - Mounir Elfassi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接