Проблема с адаптером 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. Это единственное решение.

Здесь вы можете прочитать для получения дополнительной ссылки

Другие вопросы по тегам