Как отключить элемент в Spinner

Можно ли отображать отдельные записи в списке Spinner как отключенные?

Т.е. я хочу всегда отображать счетчик с четырьмя входами (например, север, юг, восток и запад), но я хочу, чтобы можно было отключить любой из них, чтобы он выглядел серым и недоступным.

Возможно ли это, или мне придется каждый раз воссоздавать список, оставляя недопустимые записи?

Ответы

Ответ 1

   // Create spinner month, and disable month < today
    List<CharSequence> listMonth = new ArrayList<CharSequence>();
    for (int m = 0; m < 12; m++) {
        if (m < 9) {
            listMonth.add("0" + (m + 1));
        } else {
            listMonth.add("" + (m + 1));
        }
    }
        // Create spinner item
    adapterMonth = new ArrayAdapter<CharSequence>(this,
            R.layout.layout_spinner_item, listMonth) {
         // Disable click item < month current
        @Override
        public boolean isEnabled(int position) {
            // TODO Auto-generated method stub
            if (year <= max_year && position < max_month - 1) {
                return false;
            }
            return true;
        }
        // Change color item
        @Override
        public View getDropDownView(int position, View convertView,
                ViewGroup parent) {
            // TODO Auto-generated method stub
            View mView = super.getDropDownView(position, convertView, parent);
            TextView mTextView = (TextView) mView;
            if (year <= max_year && position < max_month - 1) {
                mTextView.setTextColor(Color.GRAY);
            } else {
                mTextView.setTextColor(Color.BLACK);
            }
            return mView;
        }
    };

    adapterMonth
            .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spn2.setAdapter(adapterMonth);

Ответ 2

Кто-то только что опубликовал решение вашей проблемы, см. этот старый пост.

Ответ 3

    public class MySpinnerAdapter extends BaseAdapter {

    @Override
    public void isEnabled(int position) {
       return getItem(position).isEnabled(); 
    }

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

      if(convertView == null) {
          convertView = View.inflate(parent.getContext(), R.layout.item, null);
      }
      if(!isEnabled(position)) {
          convertView.setEnabled(false);
          convertView.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                //NO-OP: Just intercept click on disabled item
             }
          });
      }

      return convertView;
    }
}

Ответ 4

Возможно ли это

Это не так. То, как вы делаете это с ListView, включает areAllItemsEnabled() и isEnabled(). Однако это методы интерфейса ListAdapter, а не интерфейс SpinnerAdapter. Поэтому я подозреваю, что они будут проигнорированы Spinner.

Ответ 5

class SpinnerAdapter(context: Context, resource: Int, list: ArrayList<String>)
    : ArrayAdapter<String>(context, resource, list) {

        override fun isEnabled(position: Int): Boolean {
            // select position to disable 
            return position != 0
        }

}