Позиция 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, журнал не печатается вообще. Позиция не вызывается. Даже журнал местоположений не печатается.
Это действительно странно, я не уверен, почему это происходит? может кто-нибудь помочь мне с этим?
Спасибо!
Ответы
Ответ 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
}
});
Это поможет вам, удачи.