方法“onItemSelected”在数组适配器和片段中不起作用

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 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 } }); 

在ListViews上,您使用onItemClicked。 OnItemSelected适用于Spinners。 这是Android的滋扰之一……

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

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

在片段中调用listView.setOnItemSelectedListener(...)的方法中,我希望你的意思是有listView.setOnItemClickListener(...) ,但是它会监听列表中某一行的点击,而不是从一个微调器。

要检测其中一个微调器的选择,请进行上面的第一次修改。 要检测listView中某行的单击,请更改为listView.setOnItemClickListener 。 如果没有更多关于您的目标的背景或实际发生的错误,很难判断是否需要这两者或只是第一个。

编辑:从你的评论,我认为你应该在你的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 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);