retrofit android null

314
21 апреля 2018, 20:26

Есть у меня ссылка, с которой я пытаюсь подгрузить JSON вида:

{
"company": {
    "name":"Center",
    "age": "15",
    "competences": ["Android", "IOS", ".NET", "PHP", "Smart-TV"],
    "employees": [{
        "name": "John",
        "phone_number": "769453",
        "skills": ["Java", "Android"]
    }, {
        "name": "Diego",
        "phone_number": "987924",
        "skills": ["Java", "Smart-TV"]
    }, {
        "name": "Alfred",
        "phone_number": "452533",
        "skills": ["Objective-C", "Android", "Photoshop"]
    }, {
        "name": "John",
        "phone_number": "212456",
        "skills": ["Java", "Phython"]
    }, {
        "name": "Mat",
        "phone_number": "778975",
        "skills": ["Android", "MovieMaker"]
    }, {
        "name": "Bob",
        "phone_number": "456468",
        "skills": ["Groovy", "Kotlin"]
    }, {
        "name": "Marty",
        "phone_number": "321789",
        "skills": ["Android", "PHP", "C#"]
    }]  
}}

классы сконвертированные

General

public class General {
@SerializedName("company")
@Expose
private Company company;
public Company getCompany() {
    return company;
}
public void setCompany(Company company) {
    this.company = company;
}}

Company

public class Company {
@SerializedName("name")
@Expose
private String name;
@SerializedName("age")
@Expose
private String age;
@SerializedName("competences")
@Expose
private List<String> competences = null;
@SerializedName("employees")
@Expose
private List<Employee> employees = null;
public List<Employee> getEmployees() {
    return employees;
}}

Employee

public class Employee {
@SerializedName("name")
@Expose
private String name;
@SerializedName("phone_number")
@Expose
private String phoneNumber;
@SerializedName("skills")
@Expose
private List<String> skills = null;
public String getName() {
    return name;
}
public String getPhoneNumber() {
    return phoneNumber;
}
public List<String> getSkills() {
    return skills;
}}

Интерфейс Api

public interface HtcApi {
@GET("/v2")
Call<General> getCompany(String url);
}

Adapter к RecyclerView

public class EmployeeAdapter extends RecyclerView.Adapter<EmployeeAdapter.ViewHolder> {
private Company company;
private General general;
List<Employee> employees;
public EmployeeAdapter(General general) {
    this.general = general;
    company = general.getCompany();
    employees = company.getEmployees();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.post_item, parent, false);
    return new ViewHolder(v);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    Employee employee = employees.get(position);
    holder.name.setText(employee.getName());
    holder.phone.setText(employee.getPhoneNumber());
    holder.skills.setText((CharSequence) employee.getSkills());
}
@Override
public int getItemCount() {
    return employees.size();
}
class ViewHolder extends RecyclerView.ViewHolder {
    TextView name;
    TextView phone;
    TextView skills;
    public ViewHolder(View itemView) {
        super(itemView);
        name = itemView.findViewById(R.id.employee_name);
        phone = itemView.findViewById(R.id.employee_phone);
        skills = itemView.findViewById(R.id.employee_skills);
    }
}

}

MainActivity

public class MainActivity extends AppCompatActivity {
RecyclerView recyclerView;
LinearLayoutManager linearLayoutManager;
RecyclerView.Adapter adapter;

General general;
HtcApi htcApi;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    htcApi = Controller.getApi();
    recyclerView = findViewById(R.id.employee_recycle_view);
    linearLayoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(linearLayoutManager);
    adapter = new EmployeeAdapter(general);
    recyclerView.setAdapter(adapter);

    htcApi.getCompany("56fa31e0110000f920a72134").enqueue(new Callback<General>() {
        @Override
        public void onResponse(Call<General> call, Response<General> response) {
            general = response.body();
            recyclerView.getAdapter().notifyDataSetChanged();
        }
        @Override
        public void onFailure(Call<General> call, Throwable t) {
            Toast.makeText(MainActivity.this, "An error occurred during networking", Toast.LENGTH_SHORT).show();
        }
    });
}}

Проблема заключается в том, что в адаптер передается пустой объект, т.е response.body() ничего не возвращает.

Answer 1

Самый простой фикс такой:

// adapter = new EmployeeAdapter(general);
// recyclerView.setAdapter(adapter);
// смысла нет в адаптере, данные в этот момент еще отсутствуют
htcApi.getCompany("56fa31e0110000f920a72134").enqueue(new Callback<General>() {
    @Override
    public void onResponse(Call<General> call, Response<General> response) {
        general = response.body();
        adapter = new EmployeeAdapter(general);
        recyclerView.setAdapter(adapter);
    }
    @Override
    public void onFailure(Call<General> call, Throwable t) {
        Toast.makeText(MainActivity.this, "An error occurred during networking", Toast.LENGTH_SHORT).show();
    }
});
READ ALSO
После запуска Intellij idea исчезает модуль проекта

После запуска Intellij idea исчезает модуль проекта

Если всё настроить вручную оно зароботает, но если снова закрить і открить Idea проблема возвращается

269
Крестики Нолики, реализация ООП на Java

Крестики Нолики, реализация ООП на Java

Не могу понять, как мне сделать очередность игроков в классе Player, то есть при начале игры, я хочу чтобы первый игрок начал свой ход со второй...

338
библиотека для подключения в Oracle

библиотека для подключения в Oracle

Есть БД Oracleнужно написать программу на java

207
(Apache PDFBox ) PDDocument.print(). Нажмите кнопку ОК на принтере

(Apache PDFBox ) PDDocument.print(). Нажмите кнопку ОК на принтере

Так запускаю печать, печать проходит с данными настройками, но единственное что не понятно - после того как задание передается на принтер,...

208