Пустой RecyclerView при нажатии кнопки назад с помощью DiffUtil - PullRequest
0 голосов
/ 26 марта 2020

Я использую 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);
        }
    }
}
...