2

My app is not compatible with Android 5.

When I run it in any other version it works with no issues.

This is what appears in the logcat when run it in 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

Here's where the problem lies based on the 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;
    }

Both regionSpinner and categorySpinner are objects of type Spinner ...

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);
    regionSpinnerSetup();
    CategorySpinnerSetup();

}

Any idea how to solve it?

Aryam Saleh
  • 338
  • 2
  • 12
  • Do you use some library adding components? I remember having the same issue using a spinner from a library. Starting from Android 5.0 (if I'm not wrong) using several types of view holders in a spinner adapter is prohibited. – AndroidEx May 17 '15 at 03:56
  • 1
    https://code.google.com/p/android/issues/detail?id=79011 – Daniel Nugent May 17 '15 at 03:58
  • @DanielNugent this is dump question but, how do i create a view with the spinner can u please just write that piece of code, – Aryam Saleh May 17 '15 at 04:06
  • @AryamSaleh Are you creating your own SpinnerAdapter, or are you using a library that does it? Can you post your code that's causing the issue? – Daniel Nugent May 17 '15 at 04:13
  • @AryamSaleh That code you posted is from Spinner.java, right? It looks like it's this: https://android.googlesource.com/platform/frameworks/base/+/lollipop-release/core/java/android/widget/Spinner.java#422 – Daniel Nugent May 17 '15 at 04:22
  • @DanielNugent yes right, sorry, i just updated the code, if you can guide me through it if you know the problem, thanks – Aryam Saleh May 17 '15 at 04:28
  • @AryamSaleh Well, there's your problem. It's not your fault, it's that you're using `ParseQueryAdapter`. @Android777 was correct in the first comment. Take a look at this: http://stackoverflow.com/questions/28328592/spinner-error-spinner-adapter-view-type-count-must-be-1 – Daniel Nugent May 17 '15 at 04:34
  • thanks, am looking at it now – Aryam Saleh May 17 '15 at 04:40
  • @DanielNugent the last comment said extend your parse adapter and override getViewTypeCount, will it work then on android 5? and where exactly should i override it, sorry for my questions – Aryam Saleh May 17 '15 at 04:43
  • @AryamSaleh I have no idea if it will work, but I posted an answer with how it might work. Your other option of course would be to set the targetSdkVersion to 19, and then it seems that you would not have to make any code changes. – Daniel Nugent May 17 '15 at 05:04
  • @DanielNugent yes is did this but i want the app to be working an android 5, the app is published to public and users of android 5 not able to use it, O_o, thanks – Aryam Saleh May 17 '15 at 05:27

2 Answers2

1

I don't have experience with ParseQueryAdapter, but from reading up on it, it seems you could do something like this.

First, create your own class that extends ParseQueryAdapter, and override getViewTypeCount():

public class MyParseAdapter extends ParseQueryAdapter<ParseObject> {

  public MyParseAdapter(Context context, QueryFactory<ParseObject> clazz){        
        super(context, clazz); 
  }

  @Override
  public int getViewTypeCount() {
     return 1;
  }
}

Then, just every place you have ParseQueryAdapter in your code, replace it with 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;
    }
Daniel Nugent
  • 43,104
  • 15
  • 109
  • 137
0

You cannot solve this because in lollypop this problem is pertaining. So this app can run on API 19 or below.

If you are developing this application, then only you can do a small change in project. Change your adapter.getViewTypeCount() to 1. That is the only solution.

Here you can read for more reference

Rahul Raina
  • 3,322
  • 25
  • 30