Почему мой recyclerView не отображает новые данные после изменения данных уведомления адаптера? - PullRequest
0 голосов
/ 19 октября 2019

В родительском упражнении у меня есть текст для редактирования на панели инструментов, и пользователь может выполнить поиск по данным, отображаемым в обзоре реселлера. Когда пользователь нажимает клавишу ввода вниз, строка в тексте редактирования отправляется фрагменту следующим образом:

Bundle bundle = new Bundle();
                                    bundle.putString(predResult, placeid);
                                    MapFragment mapFragment = new MapFragment();
                                    ListRestFragment listRestFragment = new ListRestFragment();
                                    mapFragment.setArguments(bundle);
                                    listRestFragment.setArguments(bundle);
                                    getSupportFragmentManager().beginTransaction()
                                            .replace(R.id.map, mapFragment)
                                            .replace(R.id.list_frag, listRestFragment)
                                            .commit();

, но, к сожалению, окно реселлера не обновляется, пока мой адаптер получает уведомление об изменении данных, как показанониже:

 private void queryToList(Query query) {

        query.addSnapshotListener((queryDocumentSnapshots, e) -> {
            restaurantList = queryDocumentSnapshots.toObjects(Restaurant.class);
            if (!myPrediction.contains("myPrediction")) {
                System.out.println(myPrediction);
                for (Restaurant item : restaurantList) {
                    if (item.getRestaurantID().contains(myPrediction)) {
                        restaurantListPred = new ArrayList<>();
                        restaurantListPred.add(item);
                        updateUI(restaurantListPred);
                    }
                }

            } else updateUI(restaurantList);
        });

    }

    private void updateUI(List<Restaurant> restaurants) {
        configureFab();
        configureRecyclerView(restaurants);
    }

    private void configureRecyclerView(List<Restaurant> restaurant) {

        this.adapter = new RestaurantAdapterClassic(restaurant);
        this.recyclerView.setAdapter(this.adapter);
        this.recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL);
        recyclerView.addItemDecoration(new SimpleItemDecorator(getContext()));
    }

новый список обновляется автоматически, когда пользователь делает свой запрос, но recyclerView не отображает новые данные.

, если вы хотите проверить реализацию моего адаптера:

public class RestaurantAdapterClassic extends RecyclerView.Adapter<RestaurantViewHolder> {

    private List<Restaurant> restaurantsList;

    // CONSTRUCTOR
    public RestaurantAdapterClassic(List<Restaurant> restaurants) {
        this.restaurantsList = restaurants;
    }

    @Override
    public RestaurantViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        // CREATE VIEW HOLDER AND INFLATING ITS XML LAYOUT
        Context context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.listview_pattern, parent, false);

        return new RestaurantViewHolder(view);
    }

    @Override
    public void onBindViewHolder(RestaurantViewHolder viewHolder, int position) {
        viewHolder.updateWithRestaurant(this.restaurantsList.get(position));
    }

    // RETURN THE TOTAL COUNT OF ITEMS IN THE LIST
    @Override
    public int getItemCount() {
        return this.restaurantsList.size();
    }

    public Restaurant getRestaurant(int position) {
        return this.restaurantsList.get(position);
    }

    public void filterList(List<Restaurant> filteredList) {
        restaurantsList = filteredList;
        notifyDataSetChanged();
    }

}

где моя ошибка или мое недопонимание?

РЕДАКТИРОВАТЬ РЕШЕНИЕ -

  1. Создать интерфейс На самом деле, чтобы отправить новые данные данных из моей родительской деятельностина мой фрагмент с прослушивателем, чтобы наблюдать, когда изменяются данные.
  2. Сохранить Ссылка на данные, отправляемая адаптеру

На самом деле, главной большой проблемой, с которой я столкнулся, был мой адаптер, не 'обновить, когда я отправил новый массив. Причина в том, что адаптер создает ссылку со списком / массивом. если вы хотите обновить его, вам нужно сохранить эту ссылку, получив список, стереть его и поместить / добавить новые данные внутри, например, методом addALL.

1 Ответ

0 голосов
/ 19 октября 2019

Прежде всего, adapter.notifyDataSetChanged(); не имеет никакого эффекта в коде, так как внутри updateUI вы создаете адаптер каждый раз, когда вызываете его.

Я думаю, главная проблема здесь:

if (item.getRestaurantID().contains(myPrediction)) {
    restaurantListPred = new ArrayList<>();
    restaurantListPred.add(item);
    updateUI(restaurantListPred);
}

Этот блок не выполняется вообще. Вот почему список не обновляется.

...