簡體   English   中英

notifyDataSetChanged 方法不更新 RecyclerView 布局

[英]The notifyDataSetChanged method does no update the RecyclerView layout

我創建了一個嵌套的 RecyclerView。 我從 firebase 中獲取數據,然后將其插入到一個使用另一個 RecyclerView 的 RecyclerView 中。 在我的片段中,代碼是:


    private Map<Character,List<QueryDocumentSnapshot>> carsDocuments;
    private DocumentReference connectedGroupDocumentRef;

    private RecyclerView carsRecyclerViewCards;
    private CarDetailsCardAdapter cardsAdapter;

    private View fragmentView;

    public CarsDetailsFragment() {}

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        fragmentView = inflater.inflate(R.layout.fragment_cars_details, container, false);

        // On add new car click
        FloatingActionButton addNewCarFab = (FloatingActionButton) fragmentView.findViewById(R.id.fab_add_new_car);
        addNewCarFab.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getActivity(), AddNewCar.class);
                fragmentView.getContext().startActivity(intent);
            }
        });

        carsDocuments = new HashMap<>();
        carsRecyclerViewCards = (RecyclerView) fragmentView.findViewById(R.id.rv_car_details_cards);
        connectedGroupDocumentRef = getConnectedGroupReference();
        connectedGroupDocumentRef.collection("cars").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {

            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    RelativeLayout emptyView = fragmentView.findViewById(R.id.cars_details_empty_view);
                    if (task.getResult() == null || task.getResult().isEmpty()) {
                        emptyView.setVisibility(View.VISIBLE);
                        carsRecyclerViewCards.setVisibility(View.GONE);
                    } else {
                        for (QueryDocumentSnapshot document : task.getResult()) {
                            char letter = getFirstLetter(document.getString("type"));
                            List<QueryDocumentSnapshot> carsList = carsDocuments.get(letter);
                            if (carsList == null) {
                                carsList = new ArrayList<>();
                                carsList.add(document);
                                carsDocuments.put(letter, carsList);
                            } else {
                                carsList.add(document);
                            }
                        }
                        emptyView.setVisibility(View.GONE);
                        carsRecyclerViewCards.setVisibility(View.VISIBLE);
                        cardsAdapter = new CarsCardAdapter(getActivity(), carsDocuments);
                        carsRecyclerViewCards.setLayoutManager(new LinearLayoutManager(getActivity()));
                        carsRecyclerViewCards.setAdapter(cardsAdapter);
                        setRecyclerViewListener();
                    }
                }
            }
        });
    }


    private void setRecyclerViewListener() {
          connectedGroupDocumentRef.collection("cars").addSnapshotListener(new EventListener<QuerySnapshot>() {

            @Override
            public void onEvent(@Nullable QuerySnapshot value,
                                @Nullable FirebaseFirestoreException e) {
                if (e != null) {
                    Log.d(this.getClass().getName(), "addSnapshotListener:failure", e);
                    return;
                }

                carsDocuments.clear();
                for (QueryDocumentSnapshot document : value) {
                    char letter = getFirstLetter(document.getString("full_name"));
                    List<QueryDocumentSnapshot> carsList = carsDocuments.get(letter);
                    if (carsList == null) {
                        carsList = new ArrayList<>();
                        carsList.add(document);
                        carsDocuments.put(letter, carsList);
                    } else {
                        carsList.add(document);
                    }
                }
                System.out.println("I'm HERE");
                cardsAdapter.notifyDataSetChanged();
                //carsRecyclerViewCards.invalidate(); 
            }
        });
    }

CarsCardAdapter class 中:

public class CarsCardAdapter extends RecyclerView.Adapter<CarsCardAdapter.ViewHolder> {
    private Map<Character, List<QueryDocumentSnapshot>> carsDocuments;
    private Character[] carsLetters;
    private Activity activity;

    private UsersAdapter adapterMember;

    public class ViewHolder extends androidx.recyclerview.widget.RecyclerView.ViewHolder {
        private TextView textLetter;
        private RecyclerView recyclerViewUsers;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            textLetter = itemView.findViewById(R.id.cars_details_letter);
            recyclerViewUsers = itemView.findViewById(R.id.car_details_users);
        }
    }

    CarsCardAdapter(Activity activity, Map<Character,List<QueryDocumentSnapshot>> carsDocuments) {
        this.activity = activity;
        if (carsDocuments != null) {
            this.carsDocuments = carsDocuments;
            this.carsLetters = carsDocuments.keySet().toArray(new Character[0]);
        }
    }

    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_car_cards, parent, false));
    }

    public void onBindViewHolder(ViewHolder holder, int position) {
        final char letter = this.carsLetters[position];
        final List<QueryDocumentSnapshot> carsList = carsDocuments.get(letter);
        holder.textLetter.setText(String.valueOf(letter));
        adapterMember = new UsersAdapter(activity,carsList);
        holder.recyclerViewUsers.setLayoutManager(new LinearLayoutManager(this.activity));
        holder.recyclerViewUsers.setAdapter(this.adapterMember);
    }

    public int getItemCount() {
        return this.carsLetters.length;
    }
}

重要的方法是setRecyclerViewListener ,一旦數據庫集合發生變化,它就會更新 RecyclerView。 如您所見,我刪除了carsDocuments並插入了所有報告。 然后我通過調用notifyDataSetChanged來更新適配器。 還嘗試invalidate 我確定我會進入偵聽器,因為I'm HERE會打印到日志中。 另請注意documentRef.collection("cars").get()...正在我的片段的onCreateView中執行。 可能是什么問題?

首先,添加這個:

carsRecyclerViewCards.setVisibility(View.VISIBLE);
                    cardsAdapter = new CarsCardAdapter(getActivity(), carsDocuments);
                    carsRecyclerViewCards.setLayoutManager(new LinearLayoutManager(getActivity()));
                    carsRecyclerViewCards.setAdapter(cardsAdapter);

在你的 setRecyclerViewListener(); 就像你在 addOnSuccessListener 中所做的那樣

然后刪除這個:

   connectedGroupDocumentRef.collection("cars").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {

        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                RelativeLayout emptyView = fragmentView.findViewById(R.id.cars_details_empty_view);
                if (task.getResult() == null || task.getResult().isEmpty()) {
                    emptyView.setVisibility(View.VISIBLE);
                    carsRecyclerViewCards.setVisibility(View.GONE);
                } else {
                    for (QueryDocumentSnapshot document : task.getResult()) {
                        char letter = getFirstLetter(document.getString("type"));
                        List<QueryDocumentSnapshot> carsList = carsDocuments.get(letter);
                        if (carsList == null) {
                            carsList = new ArrayList<>();
                            carsList.add(document);
                            carsDocuments.put(letter, carsList);
                        } else {
                            carsList.add(document);
                        }
                    }
                    emptyView.setVisibility(View.GONE);
                    carsRecyclerViewCards.setVisibility(View.VISIBLE);
                    cardsAdapter = new CarsCardAdapter(getActivity(), carsDocuments);
                    carsRecyclerViewCards.setLayoutManager(new LinearLayoutManager(getActivity()));
                    carsRecyclerViewCards.setAdapter(cardsAdapter);
                    setRecyclerViewListener();
                }
            }
        }
    });

把這個

 setRecyclerViewListener();

在 onCreate 中的位置

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM