Подтвердить что ты не робот

Позиция 0 не выбрана в Spinner в Android

Я создал счетчик, у которого есть три элемента

Ежедневно

Еженедельный

в месяц

В моем java файле я сделал следующее:

navSpinner = new ArrayList<SpinnerNavItem>();
        navSpinner.add(new SpinnerNavItem(getResources().getString(R.string.dailyview)));
        navSpinner.add(new SpinnerNavItem(getResources().getString(R.string.weekview)));
        navSpinner.add(new SpinnerNavItem(getResources().getString(R.string.monthview)));

        adapter = new TitleNavigationAdapter(getActivity().getApplicationContext(), navSpinner);
        mSpinner = (Spinner) rootView.findViewById(R.id.spinner);
        mSpinner.setAdapter(adapter);
        mSpinner.setOnItemSelectedListener(this);

OnItemSelected метод (реализует AdapterView.OnItemSelectedListener)

public void onItemSelected(AdapterView<?> parentView, View v, int position, long id) {

        Log.e("Position", "= " + position);

        if (mNaviFirstHit)
        {
            mNaviFirstHit = false;
        }
        else
        {

            Fragment fragment = null;
            switch (position) {
                case 0:

                    Log.e("Week", "= " + position);
                    break;

                case 1:

                    backspace = 1;

                    Log.e("Week", "= " + position);

                    break;

                case 2:

                    backspace = 1;

                    Log.e("Week", "= " + position);

                    break;

                default:
                    break;
            }
        }
    }

    public void onNothingSelected(AdapterView<?> parentView) {

    }

Adapter:

public class TitleNavigationAdapter extends BaseAdapter 
{
    private TextView txtTitle;
    private ArrayList<SpinnerNavItem> spinnerNavItem;
    private Context context;
    private TextView txtHeading;
    private SharedPreferences pref;

    public TitleNavigationAdapter(Context context, ArrayList<SpinnerNavItem> spinnerNavItem) 
    {
        this.spinnerNavItem = spinnerNavItem;
        this.context = context;
    }

    @Override
    public int getCount() 
    {
        return spinnerNavItem.size();
    }

    @Override
    public Object getItem(int index) 
    {
        return spinnerNavItem.get(index);
    }

    @Override
    public long getItemId(int position) 
    {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
        if (convertView == null) 
        {
            LayoutInflater mInflater = (LayoutInflater)
                    context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.list_item_title, null);
        }

        txtTitle = (TextView) convertView.findViewById(R.id.txtTitle);
        txtTitle.setText(spinnerNavItem.get(position).getTitle());

        txtTitle.setTextColor(context.getResources().getColor(R.color.orangeText));
        txtTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);

        pref = context.getSharedPreferences("MyPref", Context.MODE_PRIVATE);
        String text = pref.getString("selectedItem", context.getResources().getString(R.string.transaction_main_gridview));

        if (text.equalsIgnoreCase(convertView.getResources().getString(R.string.transaction_main_gridview)))
        {
            txtTitle.setText(convertView.getResources().getString(R.string.transaction_main_gridview_text));
        }
        else if (text.equalsIgnoreCase(convertView.getResources().getString(R.string.transaction_main_weekview)))
        {
            txtTitle.setText(convertView.getResources().getString(R.string.transaction_main_weekly_text));
        }
        else if (text.equalsIgnoreCase(convertView.getResources().getString(R.string.transaction_main_monthview)))
        {
            txtTitle.setText(convertView.getResources().getString(R.string.transaction_main_monthly_text));
        }

        return convertView;
    }


    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) 
    {
        if (convertView == null) 
        {
            LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.list_item_title, null);
        }

        txtTitle = (TextView) convertView.findViewById(R.id.txtTitle);
        txtTitle.setPadding(20, 20, 0, 20);

        txtHeading = (TextView) convertView.findViewById(R.id.txtheading);
        txtHeading.setVisibility(View.GONE);

        txtTitle.setText(spinnerNavItem.get(position).getTitle());
        return convertView;
    }

}

Приведенный выше код отлично работает, когда я выбираю позицию 1 или 2 (я правильно записываю журналы), затем из позиции 1 или 2, если я выбираю позицию 0, журнал не печатается вообще. Позиция не вызывается. Даже журнал местоположений не печатается.

Это действительно странно, я не уверен, почему это происходит? может кто-нибудь помочь мне с этим?

Спасибо!

4b9b3361

Ответ 1

Если вы хотите создать Spinner в фрагменте, вы должны объявить его в Fragment onCreatedView(). Не в onCreate() вашего FragmentActivity.

OnItemSelectedListener Должен быть реализован внутри вашего FragmentMain не внутри вашей деятельности, если вы хотите использовать прослушиватель на счетчике внутри фрагмента.

Эти изменения в вашем коде были протестированы.

ваш контекст возвращается в нуль (в моем тестовом коде все равно):

Context mContext = getActivity().getApplicationContext();// returns null !

, поэтому измените на:

TitleNavigationAdapter adapter = new TitleNavigationAdapter (это, navSpinner);//добавлено это

работает ли ваша деятельность OnItemSelectedListener?:

        public class InformationList  extends Activity implements OnItemSelectedListener {
    .....

Я бы также изменил это в TitleNavigationAdapter:

    @Override
public SpinnerNavItem getItem(int index) //SpinnerNavItem from Object
    {
        return spinnerNavItem.get(index);
    }

Результаты:

07-18 19:46:53.468: E/Position(27325): = 0
07-18 19:46:53.468: E/day(27325): = 0
07-18 19:47:04.487: E/Position(27325): = 1
07-18 19:47:04.488: E/Week(27325): = 1
07-18 19:47:06.426: E/Position(27325): = 2
07-18 19:47:06.426: E/month(27325): = 2

Функционирование правильно.

spinner

Ответ 2

сначала удалите getApplicationContext()

adapter = new TitleNavigationAdapter(getActivity(), navSpinner);

Также я думаю, что он вызван, но из-за ваших параметров Log не фильтрует, почему?, попробуйте это для всех Log линии

 Log.e("Position", "= " + String.valueOf(position));

после того, как вы попробуете после установки onitemSelectedListener повторно установить начальный выбор на 0, чтобы увидеть, есть ли существенная разница

надеюсь, что это поможет

Ответ 3

Этот код также работает:

    //inflate  
    View rootView = this.findViewById(android.R.id.content);
    setContentView(R.layout.list_item_title);

        navSpinner = new ArrayList<SpinnerNavItem>();
        navSpinner.add(new SpinnerNavItem(getResources().getString(R.string.dailyview)));
        navSpinner.add(new SpinnerNavItem(getResources().getString(R.string.weekview)));
        navSpinner.add(new SpinnerNavItem(getResources().getString(R.string.monthview)));

        if(navSpinner != null  && navSpinner.size() > 0)
        {
//          Context mContext = getActivity().getApplicationContext();//jrg returns null !
            TitleNavigationAdapter adapter = new TitleNavigationAdapter(this, android.R.layout.simple_spinner_item, navSpinner);//jrg

            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);//
            Spinner mSpinner = (Spinner) rootView.findViewById(R.id.spinner);       
            mSpinner.setAdapter(adapter);
            mSpinner.setOnItemSelectedListener(this);
        }
    }//OnCreate

в TitleNavigationAdapter

    public class TitleNavigationAdapter extends ArrayAdapter<SpinnerNavItem> 
    {

        public TitleNavigationAdapter(Context context,int resource ,ArrayList<SpinnerNavItem> navSpinner) 
        {
             super(context, resource , navSpinner);//jrg
            this.spinnerNavItem = navSpinner;
            this.context = context;
        }

    .....

    @Override
    public void registerDataSetObserver(DataSetObserver observer) {
        // TODO Auto-generated method stub

    }
    @Override
    public void unregisterDataSetObserver(DataSetObserver observer) {
        // TODO Auto-generated method stub

    }
    @Override
    public boolean hasStableIds() {
        // TODO Auto-generated method stub
        return false;
    }
    @Override
    public int getItemViewType(int position) {
        // TODO Auto-generated method stub
        return 0;
    }
    @Override
    public int getViewTypeCount() {
        // TODO Auto-generated method stub
        return 0;
    }
    @Override
    public boolean isEmpty() {
        // TODO Auto-generated method stub
        return false;
    }

    }

SpinnerNavItem:

открытый класс SpinnerNavItem {

private String title;
private int icon;

public SpinnerNavItem(String title, int icon)
{
    this.title = title;
    this.icon = icon;
}

public SpinnerNavItem(String title)
{
    this.title = title;

//this.icon = значок;   }

public String getTitle()
{
    return this.title;
}

public int getIcon()
{
    return this.icon;
}

}

** list_item_title.xml **

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
        <TextView
        android:text="Title"
        android:id="@+id/txtTitle"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="20dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <TextView
        android:text="Choose Time"
        android:id="@+id/txtheading"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="20dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <Spinner
        android:id="@+id/spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    </Spinner>
</LinearLayout>

Ответ 4

 navSpinner = new ArrayList<SpinnerNavItem>();
        navSpinner.add(new SpinnerNavItem(getResources().getString(R.string.dailyview)));
        navSpinner.add(new SpinnerNavItem(getResources().getString(R.string.weekview)));
        navSpinner.add(new SpinnerNavItem(getResources().getString(R.string.monthview)));

adapter = new TitleNavigationAdapter (getActivity(). getApplicationContext(), navSpinner);

над строкой кода неправильный способ вызова адаптера

как если бы вы вызывали адаптер в любой Деятельности, вы должны называть это

adapter = new TitleNavigationAdapter(this, navSpinner);
            mSpinner = (Spinner) rootView.findViewById(R.id.spinner);

или

adapter = new TitleNavigationAdapter(YourActivityNAme.this, navSpinner);

else, где бы вы ни называли этот adpater, например, в Fragment или listView, Gridview и т.д. из любого места, где вы вызываете раздувание макета вне поля Activity, вам нужно передать контекст или ссылку на класс Activity, например

Context cntxt;//declare in class
  cntxt=getActivity()//in  oncreate() in case or fragment
cntxt=context;//by passing the Activity reference in the constructor  of YourClassName class 

context - это значение, которое было передано в конструкторе типа YourClassName(Context context ,...other parameters){....}

 adapter = new TitleNavigationAdapter(cntxt, navSpinner);
                mSpinner = (Spinner) rootView.findViewById(R.id.spinner);
                mSpinner.setAdapter(adapter);
                mSpinner.setOnItemSelectedListener(this);

также здесь вы используете это в setOnItemSelectedListener, поэтому вам нужно предоставить реализацию этого слушателя в том же классе, для которого ссылка вы передаете здесь, так что  public class YourClassName extends YourExtendsClassName implements OnItemSelectedListener {......}, и все вышеперечисленное код входит в этот класс или вы оставите код, относящийся к этому классу или вы можете сделать это

 mSpinner.setOnItemSelectedListener(new OnItemSelectedListener()
        {

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
        {
            Log.e("Position", "= " + position);

            if (mNaviFirstHit)
            {
            mNaviFirstHit = false;
            }
            else
            {

                Fragment fragment = null;
                switch (position) {
                    case 0:

                        Log.e("Week", "= " + position);
                        break;

                    case 1:

                        backspace = 1;

                        Log.e("Week", "= " + position);

                        break;

                    case 2:

                        backspace = 1;

                        Log.e("Week", "= " + position);

                        break;

                    default:
                        break;
                }
            }

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent)
        {
            // TODO Auto-generated method stub

        }});

а также вам необходимо изменить для более безопасной стороны вы также должны изменить это в TitleNavigationAdapter:

 @Override
public SpinnerNavItem getItem(int index) //SpinnerNavItem from Object
    {
        return spinnerNavItem.get(index);
    }

и ваш код также будет работать для элемента position 0 также, пожалуйста, проверьте логику, которую вы написали в public void onItemSelected(AdapterView<?> parent, View view, int position, long id){...} а также  если вы хотите действительно помочь, пожалуйста, предоставьте полную информацию вместо сломанной части кода

как теперь, вы можете увидеть журнал для позиции 0 также

Ответ 5

spbBloodGrp.setOnItemSelectedListener(новый AdapterView.OnItemSelectedListener() {           Строка bloodgroup = "";

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id) {
            // TODO Auto-generated method stub
            //String bloodgroup = spbBloodGrp.getSelectedItem().toString();
            if (position != 0) {
                bloodgroup = spbBloodGrp.getSelectedItem().toString();
            }
            // Toast.makeText(getBaseContext(), bloodgroup, Toast.LENGTH_SHORT).show();
            etxtbloodGrp.setText(bloodgroup);
        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub
        }
    });

Это поможет вам, удачи.