RecyclerView: как обновить полный список CardViews с помощью ViewModel? - PullRequest
0 голосов
/ 26 июня 2019

У меня есть основной вид деятельности, который расширяет 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));
    }
}

1 Ответ

0 голосов
/ 26 июня 2019

Когда вы получили данные из наблюдения данных в реальном времени ViewModel, в методе onChanged

Метод Внутри фрагмента или внутри Activity, где вы можете получить данные наблюдений в реальном времени и отправить в адаптер метод newData.

controlRoomViewModel.getLiveDispatchData().observe(this, new Observer<Dispatch>(){
            @Override
            public void onChanged(@Nullable Dispatch dispatch) {
                if (dispatch != null) {

                    content = dispatch.getContent();
                    adapter.addContentItems((ArrayList<ContentItem>) content);
                }
            }
        });

Метод адаптера

 public void addContentItems(ArrayList<ContentItem> newContentItems) {
        if (newContentItems == null) {
            return;
        }

        if (contentItems != null && contentItems.size() > 0)
            contentItems.clear();

        for (ContentItem contentItem : newContentItems) {
            contentItems.add(contentItem);
        }
        notifyDataSetChanged();
    }

В основном вы должны вызвать notifyDataSetChanged (); перерисовать представления, потому что данные изменились.

...