ViewModel вызывается каждый раз
Я использую LiveData и ViewModel с Firebase. Я использую код ниже, чтобы показать данные в RecyclerView.
public class CategoryActivity extends AppCompatActivity {
@BindView(R.id.toolbar_category)
Toolbar toolbar;
@BindView(R.id.recycler_view_category)
RecyclerView categoryRecyclerView;
private List<Category> categoryList = new ArrayList<>();
private CategoryAdapter mAdapter;
private Context context;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_category);
ButterKnife.bind(this);
setSupportActionBar(toolbar);
context = this;
mAdapter = new CategoryAdapter(categoryList, context);
RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(this, 2);
categoryRecyclerView.setLayoutManager(mLayoutManager);
categoryRecyclerView.setItemAnimator(new DefaultItemAnimator());
categoryRecyclerView.setAdapter(mAdapter);
CategoryViewModel categoryViewModel = ViewModelProviders.of(this).get(CategoryViewModel.class);
LiveData<DataSnapshot> liveData = categoryViewModel.getDataSnapshotLiveData();
liveData.observe(this, new Observer<DataSnapshot>() {
@Override
public void onChanged(@Nullable DataSnapshot dataSnapshot) {
Log.e("CategoryActivity","inside");
Iterable<DataSnapshot> dataSnapshotIterable = dataSnapshot.getChildren();
for (DataSnapshot p : dataSnapshotIterable) {
Category categoryFromFirebase = p.getValue(Category.class);
categoryList.add(categoryFromFirebase);
}
mAdapter.notifyDataSetChanged();
}
});
}
}
Моя проблема в том, что даже если я заблокирую телефон и разблокирую его, все будет вызвано снова, и данные будут дублироваться в RecyclerView
, Я не могу понять, в чем проблема. Пожалуйста помоги.
2 ответа
Просто очистить тебя arraylist
перед добавлением iteam categoryList.clear ();
liveData.observe(this, new Observer<DataSnapshot>() {
@Override
public void onChanged(@Nullable DataSnapshot dataSnapshot) {
categoryList.clear(); //clear your arraylist values before adding
Log.e("CategoryActivity","inside");
Iterable<DataSnapshot> dataSnapshotIterable = dataSnapshot.getChildren();
for (DataSnapshot p : dataSnapshotIterable) {
Category categoryFromFirebase = p.getValue(Category.class);
categoryList.add(categoryFromFirebase);
}
mAdapter.notifyDataSetChanged();
}
});
Сначала поймите сценарий:
Блокировка устройства: методы onDestroy(), onCreate(), onStart(), onResume() будут вызваны
Разблокировка устройства: вызовет метод onResume ()
Итак, ваша логика находится в методе onCreate (), поэтому все вызывается снова и снова.
Чтобы преодолеть эту проблему, вам нужно очистить свой "список категорий" или инициализировать его снова в том же месте, чтобы создать новый экземпляр без каких-либо данных в нем.