В родительском упражнении у меня есть текст для редактирования на панели инструментов, и пользователь может выполнить поиск по данным, отображаемым в обзоре реселлера. Когда пользователь нажимает клавишу ввода вниз, строка в тексте редактирования отправляется фрагменту следующим образом:
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();
}
}
где моя ошибка или мое недопонимание?
РЕДАКТИРОВАТЬ РЕШЕНИЕ -
- Создать интерфейс На самом деле, чтобы отправить новые данные данных из моей родительской деятельностина мой фрагмент с прослушивателем, чтобы наблюдать, когда изменяются данные.
- Сохранить Ссылка на данные, отправляемая адаптеру
На самом деле, главной большой проблемой, с которой я столкнулся, был мой адаптер, не 'обновить, когда я отправил новый массив. Причина в том, что адаптер создает ссылку со списком / массивом. если вы хотите обновить его, вам нужно сохранить эту ссылку, получив список, стереть его и поместить / добавить новые данные внутри, например, методом addALL.