Как правильно заполнить массив перед вызовом AdapterFragment? Ява

#java #android #arrays #android-fragments

Вопрос:

Я получаю информацию от модернизации из файла и заполняю массив в действии в onCreate. После создания фрагмента и его настройки программа вылетает (в getItemCount) и пишет, что массив пуст и не понимает, что я хочу вывести. Как я могу заполнить массив до того, как класс адаптера фрагмента будет инициализирован?

Способ заполнения данных в массив

        public void onResponse(Call<Example> call, Response<Example> response) {
            Example examples = response.body();
            for(int i = 0; i < examples.getResponse().size(); i  ){
                String f_name = response.body().getResponse().get(i).getfName();
                String l_name = response.body().getResponse().get(i).getlName();
                String birthday = response.body().getResponse().get(i).getBirthday();
                String SpecName = response.body().getResponse().get(i).getSpecialty()
                        .iterator().next().getName();
                String SpecId =  response.body().getResponse().iterator().next().getSpecialty()
                        .iterator().next().getSpecialtyId().toString();
                String AvatarUrl = response.body().getResponse().get(i).getAvatrUrl();
                workerList.add(new Worker(f_name, l_name, birthday, SpecName, SpecId, AvatarUrl));

            }
            CurrectName(workerList);
            NewDataFormat(workerList);

        }
 

Фрагмент кода в адаптере фрагмента

 public class dataAdapter extends RecyclerView.Adapter<dataAdapter.dataViewHolder> {
    Context context;
    List<Worker> workerList;

    public dataAdapter(Context context, List<Worker> workerList){
        this.context = context;
        this.workerList = workerList;
    }

    @Override
    public dataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.single_data_fragment, parent, false);
        return new dataViewHolder(view);
    }

    @Override
    public void onBindViewHolder(dataAdapter.dataViewHolder holder, int position) {

        holder.FName.setText(workerList.get(position).getFname());
        holder.LName.setText(workerList.get(position).getLname());
        holder.Age.setText(workerList.get(position).getAge());
        if (workerList.get(position).getAvatarUrl() != ""){
            Picasso.with(context).load(workerList.get(position).getAvatarUrl()).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(holder.imageView);
        } else {
            Picasso.with(context).load(R.mipmap.ic_launcher).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(holder.imageView);
        }

    }

    @Override
    public int getItemCount() {
        return workerList.size();
    }
 

Вот в чем ошибка

 java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
            at com.example.applast.FirstFrame.dataAdapter.getItemCount(dataAdapter.java:52)
 

Примечание:
Я слаб в программировании на Android, поэтому было бы неплохо, если бы вы могли подробно объяснить, что следует ниже

Ответ №1:

вы можете попробовать это в классах адаптеров

 List<Worker> workerList = new List<Worker>()
setList(List<Worker> workerList){
  workerList.clear(); 
  workerList.addAll(workerList);
  notifyDataSetchanged();
}
 

надеюсь, это поможет вам также предотвратить сбой и обновить список адаптеров, когда вы получите список ответов.также вы можете попробовать этот способ в классе действий, чтобы инициализировать список перед его использованием и обновить его позже.

Комментарии:

1. Итак, создайте класс в адаптере? и по какой-то причине я не хочу инициализировать notifyDataSetchanged()