![](/img/trans.png)
[英]RecyclerView notifyDatasetChanged not working when notifyDatasetchanged in anonymous class method
[英]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.