Я использую MVVM
Архитектура для подачи RecyclerView, а мой RecyclerView Adapter использует DiffUtil.
Кроме того, я использую компонент навигации.
Когда данные загружаются для первого время, все работает как положено.
Проблема возникает, когда фрагмент перезагружается после нажатия кнопки назад. Например:
1) Загрузка первого фрагмента и все в порядке.
2) Я нажимаю на элемент в окне реселлера, чтобы увидеть подробности во втором фрагменте, и навигация работает нормально.
3) Я нажимаю кнопку «Назад», чтобы вернуться к первому фрагменту, в окне рециркулятора ничего не отображается.
Вот журнал, показывающий порядок событий:
1) Сначала Загрузка фрагмента и все нормально:
debinf ShopFrag: onChanged: storeEntities size is 5
debinf StoreShopAda: submitList: stores size is 5
3) Возврат к первому фрагменту после нажатия кнопки возврата:
debinf ShopFrag: onQueryTextChange: EMPTY
debinf StoreShopAda: performFiltering: LENGTH ZERO
debinf ShopFrag: onChanged: storeEntities size is 5
debinf StoreShopAda: submitList: stores size is 5
Как видите, сначала вызывается окно поиска, а затем данные передаются моему адаптеру.
Я ценю любую помощь, чтобы элементы снова появлялись в обзоре переработчика после нажатия кнопки назад.
Ниже мой фрагмент:
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
localDatabaseViewModel = ViewModelProviders.of(this).get(LocalDatabaseViewModel.class);
localDatabaseViewModel.getStoresList().observe(this, new Observer<List<StoreEntity>>() {
@Override
public void onChanged(List<StoreEntity> storeEntities) {
if (storeEntities != null && storeEntities.size() > 0) {
Log.i(TAG, "onChanged: storeEntities size is " + storeEntities.size());
noDataWarning.setVisibility(View.GONE);
adapter.submitList(storeEntities);
} else {
noDataWarning.setVisibility(View.VISIBLE);
}
}
});
}
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.search_menu, menu);
SearchManager searchManager = (SearchManager) getActivity().getSystemService(getContext().SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));
searchView.setQueryHint("Pesquisar...");
searchView.setMaxWidth(Integer.MAX_VALUE);
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
if (newText.isEmpty()) {
Log.i(TAG, "onQueryTextChange: EMPTY");
adapter.getFilter().filter("");
} else {
Log.i(TAG, "onQueryTextChange: search text is "+newText.toString());
adapter.getFilter().filter(newText);
}
return true;
}
});
}
Ниже мой адаптер:
public class StoreShoppingAdapter extends RecyclerView.Adapter<StoreShoppingAdapter.StoreShoppingViewHolder> implements Filterable {
private static final String TAG = "debinf StoreShopAda";
private LocalDatabaseViewModel localDatabaseViewModel;
private List<StoreEntity> fullList;
public StoreShoppingAdapter(FragmentActivity fragmentActivity) {
this.localDatabaseViewModel = ViewModelProviders.of(fragmentActivity).get(LocalDatabaseViewModel.class);
}
private static final DiffUtil.ItemCallback<StoreEntity> DIFF_CALLBACK = new DiffUtil.ItemCallback<StoreEntity>() {
@Override
public boolean areItemsTheSame(@NonNull StoreEntity oldItem, @NonNull StoreEntity newItem) {
return oldItem.getKey().equals(newItem.getKey());
}
@Override
public boolean areContentsTheSame(@NonNull StoreEntity oldItem, @NonNull StoreEntity newItem) {
return false;
}
};
private AsyncListDiffer<StoreEntity> differ = new AsyncListDiffer<StoreEntity>(this, DIFF_CALLBACK);
@NonNull
@Override
public StoreShoppingViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_shopping_store, parent, false);
return new StoreShoppingViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull StoreShoppingViewHolder holder, int position) {
StoreEntity store = differ.getCurrentList().get(position);
holder.storeName.setText(store.getName());
holder.storeDate.setText("TimeStamp Here");
if (store.getImage() != null && !store.getImage().isEmpty()) {
Picasso.get().load(store.getImage()).networkPolicy(NetworkPolicy.OFFLINE).into(holder.storeImage, new Callback() {
@Override
public void onSuccess() {
}
@Override
public void onError(Exception e) {
Picasso.get().load(store.getImage()).into(holder.storeImage);
}
});
} else {
holder.storeImage.setImageResource(android.R.drawable.stat_sys_phone_call_on_hold);
}
holder.storeDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
localDatabaseViewModel.deleteStore(store);
}
});
}
@Override
public int getItemCount() {
return differ.getCurrentList().size();
}
public void submitList(List<StoreEntity> stores) {
Log.i(TAG, "submitList: stores size is "+stores.size());
fullList = new ArrayList<>(stores);
differ.submitList(stores);
}
public List<StoreEntity> getCurrentItemList() {
return differ.getCurrentList();
}
@Override
public Filter getFilter() {
return shopFilter;
}
private Filter shopFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<StoreEntity> filteredList = new ArrayList<>();
if (constraint == null || constraint.length() == 0) {
Log.i(TAG, "performFiltering: LENGTH ZERO");
filteredList.addAll(fullList);
} else {
Log.i(TAG, "performFiltering: FILTERING NOW");
String filterPattern = constraint.toString().toLowerCase().trim();
for (StoreEntity store : fullList) {
if (store.getName().toLowerCase().contains(filterPattern)) {
filteredList.add(store);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
differ.submitList((List) results.values);
notifyDataSetChanged();
}
};
public class StoreShoppingViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public ImageView storeImage;
public TextView storeName, storeDate;
public ImageButton storeDelete;
public StoreShoppingViewHolder(@NonNull View itemView) {
super(itemView);
storeImage = (ImageView) itemView.findViewById(R.id.item_shoppingstore_image);
storeName = (TextView) itemView.findViewById(R.id.item_shoppingstore_name);
storeDate = (TextView) itemView.findViewById(R.id.item_shoppingstore_date);
storeDelete = (ImageButton) itemView.findViewById(R.id.item_shoppingstore_delete);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
StoreEntity store = differ.getCurrentList().get(getAdapterPosition());
Log.i(TAG, "onClick: store clicked is "+store.getName());
ShopFragmentDirections.ActionShopFragmentToShopcartFragment direction = ShopFragmentDirections.actionShopFragmentToShopcartFragment(store);
Navigation.findNavController(v).navigate(direction);
}
}
}