Following up on extrapedestrian's comment, this is what worked for me.  

Inside a custom OptionsSpinnerAdapter (extends ArrrayAdapter implements 
SpinnerAdapter):

@Override
public View getDropDownView(int position, View convertView, ViewGroup 
parent) {

   View view = convertView;

    ... code to set up view and text ...

    if (!option.isAvailable()) {
        view.setEnabled(false);  // greys out the text
        view.setClickable(true);  // makes item unclickable
    }
   
    return view;
}

On Saturday, March 13, 2010 10:20:26 AM UTC-5, extrapedestrian wrote:
>
> I did another workaround.
>
> Since I implement SpinnerAdapter, In function GetDropdownView, I check
> if item at position x should be disabled, then I make that view (row)
> disabled. Unfortunately, SetEnabled(false) is not working on this
> view, so I found workaround, like this:
>
> row.SetClickable(true); //makes item unresponsive to clicks(?)
> //grayout text and icon
> TextView.SetTextColor(Color.LTGRAY);
> Image.getDrawable().mutate().setAlpha(70);
>
> so it looks disabled and doesn't respond to clicks.
>
> hate workarounds...
>
> On Jan 29, 4:07 pm, Piwai <[email protected]> wrote:
> > Hi there !
> >
> > I spent a bit of time trying to create a spinner that would have some
> > disabled items, and finally found a SOLUTION ! Yay !
> >
> > Romain pointed in the right direction, BUT it's not that easy.
> >
> > If one try to create a specific adapter for the spinner, for
> > instance :
> >
> > ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this,
> > android.R.layout.simple_spinner_item,filters) {
> >   public boolean isEnabled(int position) {
> >     // Specific code to decide whether it's enabled or not
> >   }
> >   public boolean areAllItemsEnabled() {
> >     return false;
> >   }};
> >
> > spinner.setAdapter(spinnerAdapter);
> > => DOESN'T work yet
> >
> > When you click on a spinner, it opens a dialog with the items feeded
> > from the adapter.
> >
> > BUT the adapter is wrapped by the spinner class into a DropDownAdapter
> > (private class inside the spinner class).
> >
> > This wrapper delegates almost all method calls, except...
> >
> > public boolean areAllItemsEnabled() {
> >   return true;
> >
> > }
> >
> > public boolean isEnabled(int position) {
> >   return true;
> >
> > }
> >
> > I don't know if there's a real reason for that. The delegate is
> > wrapped as as SpinnerAdapter, which doesn't hold those methods.
> >
> > So the solution was pretty simple thought a bit dirty : extends
> > Spinner, override performClick() (this is were the adapter is
> > wrapped), and basically do the same thing as a spinner, but with a
> > patched DropDownAdapter :
> >
> > /**
> >  * A patcher spinner so that the wrapping drop down adapter delegates
> >  * areAllItemsEnabled and isEnabled calls to the wrapped adapter.
> >  */
> > public class PatchedSpinner extends Spinner {
> >
> >     public PatchedSpinner(Context context, AttributeSet attrs, int
> > defStyle) {
> >         super(context, attrs, defStyle);
> >     }
> >     public PatchedSpinner(Context context) {
> >         super(context);
> >     }
> >     public PatchedSpinner(Context context, AttributeSet attrs) {
> >         super(context, attrs);
> >     }
> >
> >     @Override
> >     public boolean performClick() {
> >
> >         // boolean handled = super.performClick(); => this line
> > removed, we do not want to delegate the click to the spinner.
> >
> >         Context context = getContext();
> >
> >         final DropDownAdapter adapter = new DropDownAdapter(getAdapter
> > ());
> >
> >         CharSequence mPrompt = getPrompt();
> >
> >         AlertDialog.Builder builder = new AlertDialog.Builder
> > (context);
> >         if (mPrompt != null) {
> >             builder.setTitle(mPrompt);
> >         }
> >         builder.setSingleChoiceItems(adapter, getSelectedItemPosition
> > (), this).show();
> >
> >         return true;
> >     }
> >
> >     private static class DropDownAdapter implements ListAdapter,
> > SpinnerAdapter {
> >         private SpinnerAdapter mAdapter;
> >
> >         public DropDownAdapter(SpinnerAdapter adapter) {
> >             mAdapter = adapter;
> >         }
> >
> >         public int getCount() {
> >             return mAdapter == null ? 0 : mAdapter.getCount();
> >         }
> >
> >         public Object getItem(int position) {
> >             return mAdapter == null ? null : mAdapter.getItem
> > (position);
> >         }
> >
> >         public long getItemId(int position) {
> >             return mAdapter == null ? -1 : mAdapter.getItemId
> > (position);
> >         }
> >
> >         public View getView(int position, View convertView, ViewGroup
> > parent) {
> >             return getDropDownView(position, convertView, parent);
> >         }
> >
> >         public View getDropDownView(int position, View convertView,
> > ViewGroup parent) {
> >             return mAdapter == null ? null : mAdapter.getDropDownView
> > (position, convertView, parent);
> >         }
> >
> >         public boolean hasStableIds() {
> >             return mAdapter != null && mAdapter.hasStableIds();
> >         }
> >
> >         public void registerDataSetObserver(DataSetObserver observer)
> > {
> >             if (mAdapter != null) {
> >                 mAdapter.registerDataSetObserver(observer);
> >             }
> >         }
> >
> >         public void unregisterDataSetObserver(DataSetObserver
> > observer) {
> >             if (mAdapter != null) {
> >                 mAdapter.unregisterDataSetObserver(observer);
> >             }
> >         }
> >
> >         // PATCHED
> >         public boolean areAllItemsEnabled() {
> >             if (mAdapter instanceof BaseAdapter) {
> >                 return ((BaseAdapter) mAdapter).areAllItemsEnabled();
> >             } else {
> >                 return true;
> >             }
> >         }
> >
> >         // PATCHED
> >         public boolean isEnabled(int position) {
> >             if (mAdapter instanceof BaseAdapter) {
> >                 return ((BaseAdapter) mAdapter).isEnabled(position);
> >             } else {
> >                 return true;
> >             }
> >         }
> >
> >         public int getItemViewType(int position) {
> >             return 0;
> >         }
> >
> >         public int getViewTypeCount() {
> >             return 1;
> >         }
> >
> >         public boolean isEmpty() {
> >             return getCount() == 0;
> >         }
> >     }
> >
> > }
> >
> > If you think I'm doing things wrong, please let me know. This patched
> > spinner suits my needs.
> >
> > Cheers,
> > Piwaï
> >
> > PS : BTW, merci Romain pour le hint dans la bonne direction.
> >
> > On Dec 15 2009, 7:54 am, Romain Guy <[email protected]> wrote:
> >
> > > I just linked to it. ListAdapter.isEnabled(int).
> >
> > > On Mon, Dec 14, 2009 at 10:49 PM, rexowner <[email protected]> wrote:
> > > > Thank you for your reply.
> >
> > > > None of the 2 Class methods or 8 inherited methods on the page cited
> > > > appear to have
> > > > anything to do with disabling items in the list.  None of the
> > > > subclasses
> > > > appear to have a way to do this either.
> >
> > > > Maybe I am dense, but it is not at all clear how to do this.
> >
> > > > On Dec 13, 2:10 pm, Romain Guy <[email protected]> wrote:
> > > >> This is performed by the adapter:
> http://d.android.com/reference/android/widget/ListAdapter.html#isEnab...)
> >
> > > >> On Fri, Dec 11, 2009 at 4:50 PM, rexowner <[email protected]> wrote:
> > > >> > I also want to do this, and after hunting around for half a day, 
> have
> > > >> > not found a way to do it,
> > > >> > and am moving on to some other priorities.
> >
> > > >> > I also would be very interested in this useful behavior.
> >
> > > >> > Sorry I can't be of more help, but if you find a way, please post.
> >
> > > >> > Thanks!
> >
> > > >> > On Dec 10, 4:36 pm, Keith Wiley <[email protected]> wrote:
> > > >> >> How do Idisable(gray out, make unselectable) an item in aSpinner?
> > > >> >> I tried calling View.disable() on the associated child of 
> theSpinner,
> > > >> >> but it remains black text (not gray) and selectable.
> >
> > > >> >> There must be some way of showing but leaving unselectable 
> certain
> > > >> >> items in aspinner, right?  This is a standard "menu" behavior 
> that
> > > >> >> goes back decades.  Android permits it, right?  I want the user 
> to see
> > > >> >> that certain options are possible under certain circumstances 
> even if
> > > >> >> they are impossible at the immediate moment...exactly the way 
> items in
> > > >> >> the main Android menu-button invoked menu can be visible but
> > > >> >> unselectable.
> >
> > > >> >> Thanks a lot.  I'm sure I'm just missing something obvious here.
> >
> > > >> >> Cheers!
> >
> > > >> > --
> > > >> > You received this message because you are subscribed to the Google
> > > >> > Groups "Android Developers" group.
> > > >> > To post to this group, send email to 
> [email protected] <javascript:>
> > > >> > To unsubscribe from this group, send email to
> > > >> > [email protected] <javascript:>
> > > >> > For more options, visit this group at
> > > >> >http://groups.google.com/group/android-developers?hl=en
> >
> > > >> --
> > > >> Romain Guy
> > > >> Android framework engineer
> > > >> [email protected]
> >
> > > >> Note: please don't send private questions to me, as I don't have 
> time
> > > >> to provide private support.  All such questions should be posted on
> > > >> public forums, where I and others can see and answer them
> >
> > > > --
> > > > You received this message because you are subscribed to the Google
> > > > Groups "Android Developers" group.
> > > > To post to this group, send email to 
> > > > [email protected]<javascript:>
> > > > To unsubscribe from this group, send email to
> > > > [email protected] <javascript:>
> > > > For more options, visit this group at
> > > >http://groups.google.com/group/android-developers?hl=en
> >
> > > --
> > > Romain Guy
> > > Android framework engineer
> > > [email protected]
> >
> > > Note: please don't send private questions to me, as I don't have time
> > > to provide private support.  All such questions should be posted on
> > > public forums, where I and others can see and answer them
>
>

-- 
-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to