Search code examples
androidretrofit

Android Retrofit: adding the list from callback into class


I'm using Retrofit for the first time here.

I want to put my List from the Callback to UsersData class. It's not possible. But if I erase everything from UsersData and put the content from Profile in UsersData then it works. But it doesn´t fulfill my needs. I need to be able to put List from Callback to UsersData class.

In my fragment:

 App.getRestClient().getAttendanceService().getUsers(48, new Callback<List<UsersData>>() {
    @Override
    public void success(List<UsersData> usersDao, Response response) {

        String ble = usersDao.get(0).getResults().get(0).getFirstName();
        Toast.makeText(getActivity(),ble, Toast.LENGTH_SHORT).show();

    }

    @Override
    public void failure(RetrofitError error) {

    }
});

App

public class App extends Application {

    private static RestClient restClient;

    public static App instance = null;

    public static Context getInstance() {
        if (null == instance) {
            instance = new App();
        }
        return instance;
    }

    @Override
    public void onCreate(){
        super.onCreate();
        restClient = new RestClient();
    }

    public static RestClient getRestClient(){
        return restClient;
    }
}

And my client

public class RestClient {

    private static final String BASE_URL = "www.Link_to_json.com" ;
    private AttendanceService attendanceService;

    public RestClient()
    {
        Gson gson = new GsonBuilder()
                .setDateFormat("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS'Z'")
                .create();

        RestAdapter restAdapter = new RestAdapter.Builder()
                //.setLogLevel(RestAdapter.LogLevel.FULL)
                .setEndpoint(BASE_URL)
                //.setClient(new OkClient(new OkHttpClient()))
                //.setConverter(new GsonConverter(gson))
                .build();

        attendanceService = restAdapter.create(AttendanceService.class);
    }

    public AttendanceService getAttendanceService()
    {
        return attendanceService;
    }
}

My interface

public interface AttendanceService {

    @GET("/GetUsers")
    void getUsers(@Query("companyId") int i, Callback<List<UsersData>> u );

}

and UsersData

public class UsersData {

    private List<Profile>  results;
    public List<Profile> getResults() {
        return results;
    }

}

Profile data class:

public  String firstName;
public  String lastname;
public  int userId;
public  String userNameId;
...

Example of json:

[
    {
        "AttendanceDate":null,
        "AttendanceStatus":1,
        "AttendanceStatusDescription":null,
        "CompanyId":48,
        "Email":"",
        "FirstName":"Sindri",
        "Gender":1,
        "Gsm":"",
        "Id":259,
        "LastName":"yeh",
        "MiddleName":"",
        "Role":0,"UserId":"corp\\marg"
    },{
        "AttendanceDate":null,
        "AttendanceStatus":1,
        "AttendanceStatusDescription":null,
        "CompanyId":48,
        "Email":"",
        "FirstName":"David",
        "Gender":1,
        "Gsm":"",
        "Id":165,
        "LastName":"Guðmundsson",
        "MiddleName":"",
        "Role":0,"UserId":"corp\\marg"
    }
]

Solution

  • Try wrapping the list/array inside the UsersData class itself:

    public interface AttendanceService {
    
        @GET("/GetUsers")
        void getUsers(@Query("companyId") int i, Callback<UsersData> u );
    }
    

    UsersData.java:

    public class UsersData {
    
        public Profile[] results;
    
        public class Profile {
            public String firstName;
            public String lastname;
            public int userId;
            public String userNameId;
        }
    }
    

    In the callback you can then iterate over the results array. As UMESH0492 comments you should also name your list in the JSON:

    {
    "profile": [
        {
            "AttendanceDate":null,
            "AttendanceStatus":1,
            "AttendanceStatusDescription":null,
            "CompanyId":48,
            "Email":"",
            "FirstName":"Sindri",
            "Gender":1,
            "Gsm":"",
            "Id":259,
            "LastName":"yeh",
            "MiddleName":"",
            "Role":0,"UserId":"corp\\marg"
        },{
            "AttendanceDate":null,
            "AttendanceStatus":1,
            "AttendanceStatusDescription":null,
            "CompanyId":48,
            "Email":"",
            "FirstName":"David",
            "Gender":1,
            "Gsm":"",
            "Id":165,
            "LastName":"Guðmundsson",
            "MiddleName":"",
            "Role":0,"UserId":"corp\\marg"
        }
    ]
    }