То, что вы сделали, это:
В классе адаптера вы пытаетесь получить данные из базы данных.
К тому времени, когда он возвращает данные, вызывается конструктор, а размер списка exerciseList
равен нулю. И еще одна вещь, на которую стоит обратить внимание: вы упомянули вызов firebase (который работает в фоновом режиме) в классе ViewHolder
.
Лучший способ сделать это:
Сначала вы получаете данные из firebase за пределами адаптера, а затем устанавливаете адаптер. подобно
В MainActivity
выполните фоновое задание (для извлечения данных из Firebase), а затем после успешного извлечения установите адаптер как
.
exerciseAdapterClass adapter = new Adapter (exerciseList);
recyclerView.setAdapter(adapter);
Если вы хотите уведомить представление переработчика о наличии каких-либо изменений в данных Firebase, вы можете сделать это, как показано ниже:
Получить измененный список (exerciseList
) Или измененный элемент (String
) из базы огня, используя
databaseReferenceAthlete.addValueEventListener
Или
databaseReferenceAthlete.addChildEventListener
, а затем
adapter.update(exerciseList);
adapter.notifyDatasetChanged;
Или
adapter.update(newString);
adapter.notifyItemChanged(position)
* Примечание. Необходимо настроить метод обновления в классе адаптера
* * Пример тысяча двадцать восемь:
Адаптер для обновления списка
public class NoteListAdapter extends RecyclerView.Adapter<NoteListAdapter.NoteViewHolder> {
private List<String> list;
public NoteListAdapter(List<String> list) {
this.list = list;
}
public void update(List<String> list){
this.list = list;
}
@NonNull
@Override
public NoteViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) {
Context context = parent.getContext();
LayoutInflater inflater = LayoutInflater.from(context);
View noteView = inflater.inflate(R.layout.item_note, parent, false);
return new NoteViewHolder(noteView);
}
@Override
public void onBindViewHolder(@NonNull NoteViewHolder holder, int i) {
String itemString = list.get(i);
holder.textView.setText(itemString);
}
@Override
public int getItemCount() {
return list.size();
}
public class NoteViewHolder extends RecyclerView.ViewHolder{
private TextView textView;
public NoteViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.text_rv);
}
}
}
в mainActivity:
public class NotesActivity extends AppCompatActivity implements NotesContract.View{
private TextView textView;
private Button add;
private NotesContract.UserActionsListener mActionsListener;
private NoteRepository repository;
private RecyclerView recyclerView;
private NoteListAdapter adapter;
List<String> list = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.text_view);
add = findViewById(R.id.button);
repository = new NoteRepository();
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new NoteListAdapter(list);
recyclerView.setAdapter(adapter);
mActionsListener = new NotePresenter(repository,this);
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mActionsListener.loadNotes("hello");
}
});
}
@Override
public void showAddNote(List<String> data) {
String line = "";
for(String s:data){
line = line.concat(s);
}
textView.setText(line);
}
@Override
public void showRecViewNote(List<String> data) {
adapter.update(data);
adapter.notifyDataSetChanged();
}
}
Посмотрите, как настроено представление переработчика
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new NoteListAdapter(list);
recyclerView.setAdapter(adapter);
и как это уведомляется
public void showRecViewNote(List<String> data) {
adapter.update(data);
adapter.notifyDataSetChanged();
}