【问题标题】:method "onItemSelected" doesn't work in array adapter and also in fragment方法“onItemSelected”在数组适配器和片段中都不起作用
【发布时间】:2016-07-24 15:26:52
【问题描述】:

onItemSelected的方法不起作用,我也不知道为什么。

下面是我的代码。

阵列适配器:

public  class MyListAdapter extends ArrayAdapter {
    Spinner spinner;
    ListView listView;

    /*public MyListAdapter(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
    }*/

    public MyListAdapter(Context context) {
        super(context, R.layout.single_listview_item);
    }




    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;

         spinner = (Spinner) convertView.findViewById(R.id.simpleSpinner);
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
                getContext(),
                R.array.country_arrays,
                android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
        System.out.println("ciao1");

      //  spinner.setOnItemSelectedListener(this);

        return row;
    }



   /* @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        String selState = (String) spinner.getSelectedItem();
        System.out.println(selState);
        Toast.makeText(
                getContext(),
                "Clicked on Planet: " + selState + "", Toast.LENGTH_SHORT).show();
    }

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

    }*/

    }

片段:

 ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_list2, container, false);
        listView = (ListView) rootView.findViewById(R.id.listview);
        ListAdapter listAdapter = new MyListAdapter(getContext());
        listView.setAdapter(listAdapter);
//      listView.setOnItemClickListener(this);
        listView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
        {
            public void onItemSelected(AdapterView<?> parent, View view, int position, long i)
            {
                listView.setSelection(position);
                String selState = (String) listView.getSelectedItem();
                Toast.makeText(
                        getContext(),
                        "Clicked on Planet: " + selState + "", Toast.LENGTH_SHORT).show();

            }

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

            }
        });

【问题讨论】:

    标签: java android listview spinner


    【解决方案1】:

    在您使用 onItemClicked 的 ListViews 上。 OnItemSelected 用于微调器。这是 Android 的麻烦之一......

    【讨论】:

    • 我必须使用数组适配器或片段中的方法吗?
    • 我必须如何编写代码才能将对象名称纳入微调器列表?
    • 你能帮帮我吗?
    【解决方案2】:

    在您在ArrayAdapter 中设置OnItemSelectedListener(this) 的方法中,我认为问题在于,因为列表中的每个微调器都引用了MyListAdapter 的相同实例,所以您的OnItemSelected 方法无法区分其中的微调器您的列表实际上是从中选择的——它只是引用了上次设置为 MyListAdapter.spinner 引用的微调器对象,它应该是列表中的最后一个。

    要解决此问题,请不要使用 spinner.getSelectedItem()。而是使用((Spinner) parent).getSelectedItem(),因为父对象将是从中选择的实际微调器。此时,您应该将 spinner 变量设置为 getView 方法的本地变量。

    在片段中调用listView.setOnItemSelectedListener(...) 的方法中,我希望你的意思是listView.setOnItemClickListener(...),但这会监听对列表中一行的点击,而不是来自微调器的选择。

    要检测来自您的一个微调器的选择,请进行上面的第一个修改。要同时检测对 listView 中一行的点击,请更改为 listView.setOnItemClickListener。如果没有更多关于您的目标或发生的实际错误的背景信息,很难判断是两者都需要还是只需要第一个。

    编辑: 从您的 cmets 来看,我认为您应该在 MyListAdapter 中有这个:

    public  class MyListAdapter extends ArrayAdapter implements AdapterView.OnItemSelectedListener {
    
    public MyListAdapter(Context context) {
        super(context, R.layout.single_listview_item);
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
    
        Spinner spinner = (Spinner) row.findViewById(R.id.simpleSpinner);
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
                parent.getContext(),
                R.array.country_arrays,
                android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
        spinner.setOnItemSelectedListener(this);
    
        return row;
    }
    
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        String selState = (String) ((Spinner) parent).getSelectedItem();
        System.out.println(selState);
        Toast.makeText(
                parent.getContext(),
                "Clicked on Planet: " + selState + "", Toast.LENGTH_SHORT).show();
    }
    
    @Override
    public void onNothingSelected(AdapterView<?> parent) {
    
    }
    
    }
    

    在你的片段中(没有听众):

    ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_list2, container, false);
        listView = (ListView) rootView.findViewById(R.id.listview);
        ListAdapter listAdapter = new MyListAdapter(getContext());
        listView.setAdapter(listAdapter);
    

    【讨论】:

    • 当我点击对象时,如何显示带有我点击对象名称的吐司?
    • 进一步查看您的代码后,我失去了一些信心。你能澄清一下你想要做什么吗?您的代码看起来像是在创建单行的 ListView,其中包含一个微调器,这似乎完全是多余的。看起来好像您已经将创建可选列表的两种不同方法的示例(简单的微调器与带有 OnItemClickListener 的 ListView)的示例混合在一起。您想要一个微调器列表还是只需要一个微调器?
    • 我想要列表视图每一行的微调器,并且 toast 必须告诉我我点击了什么对象
    • 好的。然后如果要显示在其中一个微调器中选择的项目,我建议使用在适配器中设置侦听器的方法,但更改行 String selState = (String) spinner.getSelectedItem(); to String selState = (String) ((Spinner) parent).getSelectedItem();并且根本不要在片段中为 ListView 设置监听器。
    • 将 String selState = (String) spinner.getSelectedItem() 更改为 String selState = (String) ((Spinner) parent).getSelectedItem();我有同样的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 2012-06-14
    • 2016-11-09
    • 2020-01-02
    • 1970-01-01
    相关资源
    最近更新 更多