У меня есть основной вид деятельности, который расширяет AppCompatActivity с RecyclerView. Работает нормально, чтобы загрузить список CardViews из базы данных Room, а затем отфильтровать список. Проблема возникает после нажатия клавиши «Пробел», чтобы вернуть пользователя в исходный список.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(layout.activity_main);
...
mViewModel = ViewModelProviders.of(MainActivity.this).get(MainViewModel.class);
mViewModel.getAllCards().observe(this, new Observer<List<Card>>() {
@Override
public void onChanged(@Nullable final List<Card> cards) {
if (cards == null) {
return;
}
adapter.setCardList(cards);
}
});
}
Я фильтрую Список, используя щелчок на TextView, и это тоже хорошо работает.
allWaitingfors.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mViewModel.filterListCardTypeWaitingfor() != null) {
mViewModel.filterListCardTypeWaitingfor().removeObservers((AppCompatActivity) context);
}
mViewModel.filterListCardTypeWaitingfor().observe(MainActivity.this, new Observer<List<Card>>() {
@Override
public void onChanged(@Nullable final List<Card> filterWaitingforCards) {
if (filterWaitingforCards != null && filterWaitingforCards.size() == 0) {
Toast.makeText(MainActivity.this, "There are no cards", Toast.LENGTH_SHORT).show();
}
else {
adapter.setCardList(filterWaitingforCards);
}
}
});
dialogFilter.dismiss();
}
});
Если список в настоящее время фильтруется, а затем пользователь нажимает клавишу «Пробел», я хотел бы вернуть пользователя в исходный список RecyclerView. Вот где моя проблема. CardViews не загружаются в список. Что мне здесь не хватает?
@Override
public void onBackPressed() {
if (mViewModel.filterListCardTypeWaitingfor() != null) {
mViewModel.filterListCardTypeWaitingfor().removeObservers((AppCompatActivity) context);
mViewModel.getAllCards().removeObservers((AppCompatActivity) context);
mViewModel.getAllCards().observe(this, new Observer<List<Card>>() {
@Override
public void onChanged(@Nullable final List<Quickcard> cards2) {
if (cards2 == null) {
return;
}
else {
adapter.setCardList(cards2);
}
});
}
else {
Toast.makeText(MainActivity.this, "Exit", Toast.LENGTH_SHORT).show();
MainActivity.this.finish();
super.onBackPressed();
}
}
Адаптер
public class CardListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private LayoutInflater layoutInflater;
private List<Card> cardList = Collections.emptyList();
public CardListAdapter(Context context, RecyclerItemClickListener recyclerItemClickListener) {
this.context = context;
this.layoutInflater = LayoutInflater.from(context);
}
…
public void setCardList(List<Card> newCardsList) {
if (cardList != null) {
PostDiffCallback postDiffCallback = new PostDiffCallback(cardList, newCardsList);
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(postDiffCallback);
cardList.clear();
this.cardList = newCardsList;
diffResult.dispatchUpdatesTo(this);
} else {
this.cardList = newCardsList;
}
}
class PostDiffCallback extends DiffUtil.Callback {
private final List<Card> oldPosts, newPosts;
private PostDiffCallback(List<Card> oldPosts, List<Card> newPosts) {
this.oldPosts = oldPosts;
this.newPosts = newPosts;
}
@Override
public int getOldListSize() {
return oldPosts.size();
}
@Override
public int getNewListSize() {
return newPosts.size();
}
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return oldPosts.get(oldItemPosition).getId() == newPosts.get(newItemPosition).getId();
}
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
return oldPosts.get(oldItemPosition).equals(newPosts.get(newItemPosition));
}
}