Проблема с адаптером Spinner в Android 5.0
Мое приложение не совместимо с Android 5.
Когда я запускаю его в любой другой версии, он работает без проблем.
Вот что появляется в logcat при запуске его в Android 5:
05-16 23:44:10.287 1969-1969/com.barakah.camel E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.barakah.camel, PID: 1969
java.lang.IllegalArgumentException: Spinner adapter view type count must be 1
Вот где проблема лежит на основе logcat:
public void regionSpinnerSetup() {
ParseQueryAdapter.QueryFactory<ParseObject> factory = new ParseQueryAdapter.QueryFactory<ParseObject>() {
public ParseQuery create() {
ParseQuery query = new ParseQuery("Region");
return query;
}
};
regionAdapter = new ParseQueryAdapter<ParseObject>(getActivity(),
factory);
regionAdapter.setTextKey("name");
regionSpinner.setAdapter(regionAdapter);
regionSpinner.setSelection(1);
regionSpinner.setOnItemSelectedListener(new RegionSpinnerListener());
}
public void CategorySpinnerSetup() {
ParseQueryAdapter.QueryFactory<ParseObject> factory = new ParseQueryAdapter.QueryFactory<ParseObject>() {
public ParseQuery create() {
ParseQuery query = new ParseQuery("Category");
return query;
}
};
categoryAdapter = new ParseQueryAdapter<ParseObject>(getActivity(),
factory);
categoryAdapter.setTextKey("name");
categorySpinner.setAdapter(categoryAdapter);
categorySpinner.setSelection(1);
categorySpinner
.setOnItemSelectedListener(new CategorySpinnerListener());
}
class RegionSpinnerListener implements Spinner.OnItemSelectedListener {
@Override
public void onItemSelected(AdapterView parent, View v, int position,
long id) {
// TODO Auto-generated method stub
ParseObject theSelectedObject = regionAdapter.getItem(position);
Log.e("ABC", "Name is : " + theSelectedObject.getString("name") + " objectId is : " + theSelectedObject.getObjectId());
regionobject = theSelectedObject;
}
И regionSpinner, и categorySpinner являются объектами типа Spinner ...
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
regionSpinnerSetup();
CategorySpinnerSetup();
}
Есть идеи как это решить?
2 ответа
У меня нет опыта работы с ParseQueryAdapter
Но, читая об этом, кажется, вы могли бы сделать что-то вроде этого.
Во-первых, создайте свой собственный класс, который расширяет ParseQueryAdapter
и переопределить getViewTypeCount()
:
public class MyParseAdapter extends ParseQueryAdapter<ParseObject> {
public MyParseAdapter(Context context, QueryFactory<ParseObject> clazz){
super(context, clazz);
}
@Override
public int getViewTypeCount() {
return 1;
}
}
Тогда, просто каждое место у вас есть ParseQueryAdapter
в вашем коде замените его на MyParseAdapter
:
public void regionSpinnerSetup() {
MyParseAdapter.QueryFactory<ParseObject> factory = new MyParseAdapter.QueryFactory<ParseObject>() {
public ParseQuery create() {
ParseQuery query = new ParseQuery("Region");
return query;
}
};
regionAdapter = new MyParseAdapter<ParseObject>(getActivity(),
factory);
regionAdapter.setTextKey("name");
regionSpinner.setAdapter(regionAdapter);
regionSpinner.setSelection(1);
regionSpinner.setOnItemSelectedListener(new RegionSpinnerListener());
}
public void CategorySpinnerSetup() {
MyParseAdapter.QueryFactory<ParseObject> factory = new MyParseAdapter.QueryFactory<ParseObject>() {
public ParseQuery create() {
ParseQuery query = new ParseQuery("Category");
return query;
}
};
categoryAdapter = new MyParseAdapter<ParseObject>(getActivity(),
factory);
categoryAdapter.setTextKey("name");
categorySpinner.setAdapter(categoryAdapter);
categorySpinner.setSelection(1);
categorySpinner
.setOnItemSelectedListener(new CategorySpinnerListener());
}
class RegionSpinnerListener implements Spinner.OnItemSelectedListener {
@Override
public void onItemSelected(AdapterView parent, View v, int position,
long id) {
// TODO Auto-generated method stub
ParseObject theSelectedObject = regionAdapter.getItem(position);
Log.e("ABC", "Name is : " + theSelectedObject.getString("name") + " objectId is : " + theSelectedObject.getObjectId());
regionobject = theSelectedObject;
}
Вы не можете решить это, потому что в lollypop эта проблема имеет отношение. Так что это приложение может работать на API 19 или ниже.
Если вы разрабатываете это приложение, то только вы можете внести небольшое изменение в проект. Измени свой adapter.getViewTypeCount()
1. Это единственное решение.
Здесь вы можете прочитать для получения дополнительной ссылки