为什么适配器通知数据更改后我的recyclerView不显示新数据?

问题描述 投票:0回答:1

在上级活动中,我在工具栏中有一个编辑文本,用户可以通过recyclerview显示的数据进行搜索。当用户按下Enter键时,edittext中的字符串将通过:

发送到片段
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();

但是,不幸的是,在通知我的适配器数据更改时,recyclerview不会重新刷新,如下所示:

 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();
    }

}

我的错误或误解在哪里?

android android-fragments android-recyclerview adapter recycler-adapter
1个回答
0
投票

首先,adapter.notifyDataSetChanged();在代码中没有任何作用,因为每次调用适配器时都在updateUI内部创建适配器。

我认为,主要问题在这里:

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);
        }
    }
}

此块根本不执行。这就是为什么每次您获得restaurantList的原因。

© www.soinside.com 2019 - 2024. All rights reserved.