Spinner OnItemSelected 使用自定义适配器
Spinner OnItemSelected With Custom Adapter
我有一个 Spinner
,它使用覆盖 getView() 的自定义适配器。我在捕获 OnItemSelected
事件时遇到问题,我认为这与自定义适配器有关。在我的 onCreate() 中,我有这个:
superGroupAdapter = new SuperGroupAdapter(context, R.layout.row_sg, sg_list);
sgSpinner.setAdapter(superGroupAdapter);
sgSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int pos, long id) {
Log.d(Constants.TAG, "sg spinner on item selected");
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
这是我的自定义适配器 class:
public class SuperGroupAdapter extends ArrayAdapter<String> {
@Inject SharedVisualElements sharedVisualElements;
Context context;
ArrayList<String> sg_list;
public SuperGroupAdapter(Context context, int textViewResourceId, ArrayList<String> sg_list) {
super(context, textViewResourceId, sg_list);
// add this line for any class that want to use any of the singleton objects
Injector.INSTANCE.getAppComponent().inject(this);
this.context = context;
this.sg_list = sg_list;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
public View getCustomView(int position, View convertView, ViewGroup parent) {
parent.setBackgroundColor(sharedVisualElements.backgroundColor());
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row = inflater.inflate(R.layout.row_sg, parent, false);
TextView label = (TextView) row.findViewById(R.id.sg_name);
label.setText(sg_list.get(position));
label.setTypeface(sharedVisualElements.font());
label.setTextColor(sharedVisualElements.primaryFontColor());
label.setGravity(Gravity.CENTER_HORIZONTAL);
return row;
}
}
当 activity 初始化时,我看到日志输出
sg spinner on item selected
但那是我最后一次看到它。无论我 select 旋转器中的某个项目多少次,它都不会再次触发。我到处寻找一种方法来捕获它,但无济于事。谁能帮忙?谢谢。
编辑
我还尝试更改 class 签名以实现 OnItemSelected
并将侦听器声明为单独的方法,如 Android docs 中所述,但得到了相同的结果。
我对这个很迷茫。感谢您的帮助。
我认为你在适配器之前遗漏了这个 SuperGroupAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
将项目添加到 sg_list 或更改 sg_list.
好吧,我想通了。在查看其他一些帖子后,我突然想到,在我的测试数据中,我的微调列表中只有一个项目。 OnItemSelectedListener
仅在您 更改 选择时触发。
来自 OnItemSelectedListener
的 Android 文档
This callback is invoked only when the newly selected position is
different from the previously selected position or if there was no
selected item.
因此,当 activity 初始化时,它选择了位置 0 处的项目。当我点击微调器和 'selected' 相同的项目时,此操作不会触发该事件。活到老,学到老。
我有一个 Spinner
,它使用覆盖 getView() 的自定义适配器。我在捕获 OnItemSelected
事件时遇到问题,我认为这与自定义适配器有关。在我的 onCreate() 中,我有这个:
superGroupAdapter = new SuperGroupAdapter(context, R.layout.row_sg, sg_list);
sgSpinner.setAdapter(superGroupAdapter);
sgSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int pos, long id) {
Log.d(Constants.TAG, "sg spinner on item selected");
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
这是我的自定义适配器 class:
public class SuperGroupAdapter extends ArrayAdapter<String> {
@Inject SharedVisualElements sharedVisualElements;
Context context;
ArrayList<String> sg_list;
public SuperGroupAdapter(Context context, int textViewResourceId, ArrayList<String> sg_list) {
super(context, textViewResourceId, sg_list);
// add this line for any class that want to use any of the singleton objects
Injector.INSTANCE.getAppComponent().inject(this);
this.context = context;
this.sg_list = sg_list;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
public View getCustomView(int position, View convertView, ViewGroup parent) {
parent.setBackgroundColor(sharedVisualElements.backgroundColor());
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row = inflater.inflate(R.layout.row_sg, parent, false);
TextView label = (TextView) row.findViewById(R.id.sg_name);
label.setText(sg_list.get(position));
label.setTypeface(sharedVisualElements.font());
label.setTextColor(sharedVisualElements.primaryFontColor());
label.setGravity(Gravity.CENTER_HORIZONTAL);
return row;
}
}
当 activity 初始化时,我看到日志输出
sg spinner on item selected
但那是我最后一次看到它。无论我 select 旋转器中的某个项目多少次,它都不会再次触发。我到处寻找一种方法来捕获它,但无济于事。谁能帮忙?谢谢。
编辑
我还尝试更改 class 签名以实现 OnItemSelected
并将侦听器声明为单独的方法,如 Android docs 中所述,但得到了相同的结果。
我对这个很迷茫。感谢您的帮助。
我认为你在适配器之前遗漏了这个 SuperGroupAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
将项目添加到 sg_list 或更改 sg_list.
好吧,我想通了。在查看其他一些帖子后,我突然想到,在我的测试数据中,我的微调列表中只有一个项目。 OnItemSelectedListener
仅在您 更改 选择时触发。
来自 OnItemSelectedListener
This callback is invoked only when the newly selected position is different from the previously selected position or if there was no selected item.
因此,当 activity 初始化时,它选择了位置 0 处的项目。当我点击微调器和 'selected' 相同的项目时,此操作不会触发该事件。活到老,学到老。