我在使用片段时,对于实现一个选择器 OnItemSelected
方法遇到了困难。
我有一个管理两个片段的 Activity
,其中唯一相关的是主页片段。
我正在实现 AdapterView.OnItemSelectedListener
并覆盖两个方法 OnItemSelected
和 onNothingSelected
。
我的 spinner
选项正确显示。问题在于我的 onItemSelected
没有被调用。
我尝试了类似问题的解决方案,但并没有对我起作用。
编辑:完整的片段+适配器代码
public class HomeFrag extends Fragment implements AdapterView.OnItemSelectedListener {
Map <String,ArrayList<ServiceItem>> dataMap;
private ArrayList<SpinnerItem> categoryList;
private CategoryAdapter categoryAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View fragView = inflater.inflate(R.layout.home_frag,null);
categoriesSpinner = fragView.findViewById(R.id.categorySpinner);
categoryList = new ArrayList<>();
categoryAdapter = new CategoryAdapter(getActivity(),categoryList);
categoriesSpinner.setAdapter(categoryAdapter);
categoryAdapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
categoriesSpinner.setOnItemSelectedListener(this);
return fragView;
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Log.e(TAG,"was pressed");
SpinnerItem item = (SpinnerItem) parent.getItemAtPosition(position);
Log.e(TAG,item.getCategoryName()+ "was pressed");
initData(item.getCategoryName());
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mRecyclerView = view.findViewById(R.id.recyclerview);
dataMap = new HashMap<>();
mRecyclerView.setLayoutManager(new GridLayoutManager(mContext, 3));
mServerHandler = new ServerHandler();
mMenuList = new ArrayList<>();
nMenuAdapter = new MenuAdapter(mContext, mMenuList);
nMenuAdapter.setOnMenuClickListener(new MenuAdapter.OnMenuClickListener() {
@Override
public void OnMenuClick(ServiceItem iMenu) {
mServerHandler.fetchMenu(iMenu.getM_name());
}
});
mRecyclerView.setAdapter(nMenuAdapter);
mServerHandler.SetOnServicesFetchedListener(new ServerHandler.OnServicesFetchedListener() {
@Override
public void OnServicesFetched(Map<String,ArrayList<ServiceItem>> i_servicesData) {
updateDataMap(i_servicesData);
initData("all");
}
});
mServerHandler.SetOnOptionFetchedListener(new ServerHandler.OnOptionFetchedListener() {
@Override
public void OnMenuFetch(Option i_opt, ServiceItem i_service) {
Intent intent = new Intent(mContext, OptionsListActivity.class);
intent.putExtra(OPTION_SELECTED, i_opt);
intent.putExtra("service", i_service);
startActivity(intent);
}
});
getData();
}
private void initData(String i_categoryToDisplay) {
mMenuList.clear();
for (ServiceItem si : dataMap.get(i_categoryToDisplay)) {
mMenuList.add(si);
}
nMenuAdapter.setmMenuListFull(new ArrayList<>(mMenuList));
mRecyclerView.getAdapter().notifyDataSetChanged();
initList();
}
private void updateDataMap(Map<String,ArrayList<ServiceItem>> i_servicesData) {
dataMap = i_servicesData;
}
@Override
public void onCreateOptionsMenu(Menu menu,MenuInflater menuInflater) {
menuInflater.inflate(R.menu.services_menu, menu);
MenuItem menuItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) menuItem.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
return false;
}
@Override
public boolean onQueryTextChange(String s) {
Log.e(TAG,"s = "+s);
nMenuAdapter.getFilter().filter(s);
return false;
}
});
super.onCreateOptionsMenu(menu,menuInflater);
}
public void initHomeFrag(final Context i_context, User i_user) {
mContext = i_context;
mUser = i_user;
}
private void getData() {
mServerHandler.fetchServices();
}
private void initList()
{
Log.e(TAG,"dataMap: "+dataMap.toString());
if (dataMap!=null)
{
for (Map.Entry<String, ArrayList<ServiceItem>> entry : dataMap.entrySet()) {
Log.e(TAG,"cat is: "+entry.getKey());
categoryList.add(new SpinnerItem(entry.getKey(),R.drawable.ic_home));
}
}
}
public class CategoryAdapter extends ArrayAdapter<SpinnerItem> {
public CategoryAdapter(Context context, ArrayList<SpinnerItem> categoryList)
{
super(context,0,categoryList);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
return initView(position, convertView, parent);
}
@Override
public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
return initView(position, convertView, parent);
}
private View initView(int position,View convertView,ViewGroup parent)
{
if (convertView==null)
{
convertView = LayoutInflater.from(getContext()).inflate(
R.layout.category_spinner_item,parent,false
);
}
ImageView imageView = convertView.findViewById(R.id.image_category);
TextView textView = convertView.findViewById(R.id.text_view_category);
SpinnerItem curItem = getItem(position);
if (curItem!=null)
{
imageView.setImageResource(curItem.getFlagImage());
textView.setText(curItem.getCategoryName());
}
return convertView;
}
}
我没有遇到任何错误,只是忽略了选择的spinner
项。