片段旋转器的onItemSelected方法从未被调用

3

我在使用片段时,对于实现一个选择器 OnItemSelected 方法遇到了困难。

我有一个管理两个片段的 Activity ,其中唯一相关的是主页片段。

我正在实现 AdapterView.OnItemSelectedListener 并覆盖两个方法 OnItemSelectedonNothingSelected

我的 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项。


你忘记设置带有列表的Spinner了。 - Manoj Perumarath
制作一个数组适配器并将列表传入下拉框中,或者可以通过制作自定义适配器来实现。 - Shivam Oberoi
1个回答

0

您没有为适配器设置下拉视图。请按照以下方式初始化您的下拉框:

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

我按照你提到的做法进行了操作,但仍然无法执行onItemSelected...唯一的区别在于我的myAdapter构造函数是: public CategoryAdapter(Context context, ArrayList<SpinnerItem> categoryList) { super(context,0,categoryList); } - Or Bitton
我建议您将完整的代码片段添加到操作中。 - Yash
我附上了完整的适配器和片段代码,感谢您的帮助。 - Or Bitton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接