简体   繁体   中英

Fragment spinner onItemSelected method never called

I'm having difficulties on implementing a spinner OnItemSelected method using fragments.

I have an Activity which manages two fragments. the only one relevent is the home frag.

I'm implementing the AdapterView.OnItemSelectedListener and overriding the two methods OnItemSelected and onNothingSelected .

My spinner options shown correctly. Problem is that my onItemSelected never being called.

I've tried solutions for similar questions but it did not work for me.

Edit: full fragment + adpater code

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

I had no errors just ignoring selected spinner item being selected.

You didn't set a dropdown view for the adapter. Initialize your spinner like this:

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

    yourAdapter = new YourAdapter(this, android.R.layout.simple_spinner_item, list);
    categoriesSpinner.setAdapter(adapter);
    yourAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    categoriesSpinner.setOnItemSelectedListener(this);
    return fragView;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM