Как установить адаптер представления рециркулятора в onCreate, когда переданная переменная инициализируется позже? - PullRequest
0 голосов
/ 30 марта 2020
@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    recyclerView= findViewById(R.id.recyclerview_student);
    final StudentAdapter adapter= new StudentAdapter(this);
    recyclerView.setAdapter(adapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    buttonAddTask=findViewById(R.id.Fbutton_add);
    buttonAddTask.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent= new Intent(MainActivity.this, addStudent.class);
            startActivity(intent);
        }
    });

    getStudents();
}

Это основное занятие

@Override
protected void onPostExecute(List<Student> student) {
    super.onPostExecute(student);
    Log.e("size","student adapter check");
    StudentAdapter adapter= new StudentAdapter(MainActivity.this, student);
    Log.e("adapter","NULL check");
    recyclerView.setAdapter(adapter);
}

Это onPostExecute

public StudentAdapter(Context mCtx, List<Student> studentList) {
    this.mCtx = mCtx;
    this.studentList = studentList;
}

и это конструктор адаптера

Что я хочу сделать, это инициализировать этот конструктор из onCreate. Но я не могу этого сделать, так как сначала список будет нулевым. Потому что после этого я получаю данные для списка (дБ комнаты), используя функцию asyn c task. Но если я установил адаптер в onPost (), приложение не будет работать, показывая, что адаптер не установлен.

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

В onCreate создайте адаптер с пустым arrayList (не нулевым) и свяжите его с представлением переработчика.

всякий раз, когда у вас есть новый список из БД или API, обновляйте sh список в адаптере, вызывая метод refre sh список, не создавайте несколько объектов адаптера.

в адаптере

public void swapData(List<Student> filtersList) {
    if (filtersList != null) {
        this.arrayList.clear();
        this.arrayList.addAll(filtersList);
        notifyDataSetChanged();
    }
}

вызовите этот метод, когда вы обновили набор данных в действии:

protected void onPostExecute(List<Student> student) {
        super.onPostExecute(student);
        Log.e("size","student adapter check");
        adapter.swapData(student);
    }
0 голосов
/ 30 марта 2020

Создайте функцию в адаптере, например

public void setData(List<Student> studentList){
    this.studentList=studentList;
    notifyDataSetChanged();
}

, после этого, как только вы получите данные из БД, установите значение

adapter.setData(studentList);

, и это все, что вам нужно сделать.

...