Spinner with checkbox items, is it possible?

前端 未结 6 1186
南笙
南笙 2020-12-06 06:48

Spinner with checkbox items, is it possible?

6条回答
  •  粉色の甜心
    2020-12-06 07:19

    I created a dynamic filled Spinner which gets its content over the Sqlite Database query over the content resolver, it's a Image instead of text when closed, it shows whats selected, and its awesome simple :-)

            spinnerFavorites = (SpinnerMultiSameClick) v.findViewById(R.id.guide_btn_favorites);
            spinnerFavorites.setOnItemSelectedListener(this);    
            ContentResolver resolver = activity.getContentResolver();
            String[] projection = new String[] { DataContract.Favorites.FAVORITES_ID, DataContract.Favorites.NAME };
    
            Cursor cursor = resolver.query(DataContract.Favorites.CONTENT_URI, projection, null, null, DataContract.Favorites.FAVORITES_ID +" ASC");
            if (cursor.getCount() > 0) {
                // create an array to specify which fields we want to display
                String[] from = new String[] { DataContract.Favorites.NAME, DataContract.Favorites.FAVORITES_ID };
                // create an array of the display item we want to bind our data
                // to
                int[] to = new int[] { android.R.id.text1, android.R.id.text2 };
                SimpleCursorAdapter adapter = new SimpleCursorAdapter(activity, R.layout.ghost_text, cursor, from, to,
                        SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
    
                // get reference to our spinner
                spinner.setAdapter(adapter);
    
                adapter.setDropDownViewResource(android.R.layout.simple_list_item_single_choice);
    
    
            } else {
                // TODO: Maybe button to make new favList               
                spinnerFavorites.setVisiblity(View.GONE);
    
            }
    

    Now, it looks like a simple Spinner, what makes it show its selection is this line, it will fill the values and put a radioCheckbox on the right side, the top/1st Element in your list will be preselected.

    adapter.setDropDownViewResource(android.R.layout.simple_list_item_single_choice);
    

    there are several other predefined layouts wich work pretty well

    • simple_list_item_checked -> shows a checkMark instead of a RadioButton
    • simple_list_item_activated_1 or 2 -> Changes BackgroundColor
    • simple_list_item_multiple_choice -> CheckBoxes with checkMarks

    to complete here is my layout, it shows an marked or unmarked Image (and not whats selected) therefore i specified R.layout.ghost_text in the spinnerAdapter.

            
    

    here my onItemSelecte which needs the OnItemSelectedListener Interfaces. What it does, it keeps track with a boolean if its the initialisation of the spinner or not. If there is a real click, we extract the information and update another UI Element over a Controller (could also be a callback) if the Clicked Element is the StandardSelected Element i set the SpinnerImage unselected, if its sth else then the standard element i set the spinnerImage selected.

    @Override
    public void onItemSelected(AdapterView parent, View view, int pos, long id) {
    
        if (parent.getId() == R.id.guide_btn_favorites) {
    
            if (!AbsintheViewControllerFactory.getGuideController().isFavoriteListInitialisation()) {
                Cursor c = (Cursor) parent.getItemAtPosition(pos);
                String favid = c.getString(c.getColumnIndexOrThrow(DataContract.Favorites.FAVORITES_ID));
                String name = c.getString(c.getColumnIndexOrThrow(DataContract.Favorites.NAME));
                Log.d(TAG, "Set Filter to FavListId: " + favid + " by its name: " + name);
                if (favid.equalsIgnoreCase(GuideViewController.allChannelsFavoritesIdentifier)) {
                    spinnerFavorites.setSelected(false);
                } else {
                    spinnerFavorites.setSelected(true);
                }
                AbsintheViewControllerFactory.getGuideController().setFavourites(favid);
    
                guideInfoSelectedFavoriteList.setText(name);
            } else {
                AbsintheViewControllerFactory.getGuideController().setFavoriteListInitialisation(false);
                guideInfoSelectedFavoriteList.setText(getActivity().getResources().getString(R.string.FILTER_FAVORITE_ALL_CHANNELS));
            }
        }
    }
    

提交回复
热议问题