При разработке приложения android я использовал RecyclerView с расширяемым ConstraintLayout. Я заполнил все данные из базы данных Firebase в реальном времени. Чтобы продолжить работу даже с автономными возможностями, в моем классе приложения
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
я установил логическое значение для проверки, развернут ли макет или нет, и установил setOnCLickListener
в заголовке-текстовом представлении для расширения и свернуть элемент RecyclerView. Он работает даже в автономном режиме go, но иногда кэшированные и даже онлайн-данные не расширяют макет, как следует. Иногда это работает, а иногда даже после нескольких нажатий, то это не работает. Вот Fragment
для заполнения представления,
public class testFrag extends Fragment {
ArrayList<healthTip> arrayList;
RecyclerView recyclerView;
fireAdapter adapter;
DatabaseReference reference;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_test, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
recyclerView = view.findViewById(R.id.recyclerView_tips_test);
arrayList = new ArrayList<>();
reference = FirebaseDatabase.getInstance().getReference().child("tips");
adapter = new fireAdapter(arrayList);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
arrayList.clear();
for (DataSnapshot a : dataSnapshot.getChildren()) {
healthTip healthTip = a.getValue(com.asif.dsdr.ui.fire_DB.healthTip.class);
arrayList.add(healthTip);
}
adapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
И для моего адаптера RecyclerView
, который я реализовал,
public class fireAdapter extends RecyclerView.Adapter<fireAdapter.itemViewHolder> {
public ArrayList<healthTip> healthTips;
@NonNull
@Override
public itemViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.tipsitem, viewGroup, false);
return new itemViewHolder(view);
}
fireAdapter(ArrayList<healthTip> healthTips1) {
healthTips = healthTips1;
}
class itemViewHolder extends RecyclerView.ViewHolder {
TextView title;
TextView description;
ConstraintLayout exp;
itemViewHolder(@NonNull View itemView) {
super(itemView);
title = itemView.findViewById(R.id.tips_title);
description = itemView.findViewById(R.id.tips_description);
exp = itemView.findViewById(R.id.expandableLayout);
title.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
healthTip healthTip = healthTips.get(getAdapterPosition());
healthTip.setExpanded(!healthTip.isExpanded());
notifyItemChanged(getAdapterPosition());
}
});
}
}
@Override
public void onBindViewHolder(@NonNull itemViewHolder viewHolder, int i) {
healthTip itemResource = healthTips.get(i);
viewHolder.title.setText(itemResource.getTitle());
viewHolder.description.setText(itemResource.getDescription());
boolean isExpanded = healthTips.get(i).isExpanded();
viewHolder.exp.setVisibility(isExpanded ? View.VISIBLE : View.GONE);
}
@Override
public int getItemCount() {
return healthTips.size();
}
}
А для экземпляра извлеченных данных я реализовал ,
public class healthTip {
String title;
String Description;
boolean expanded;
public healthTip(String title, String description) {
this.title = title;
Description = description;
this.expanded = false;
}
public healthTip() {
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public List<String> getDescription() {
List<String> list = new ArrayList<>();
list.add(this.Description);
return list;
}
public void setDescription(String description) {
Description = description;
}
public boolean isExpanded() {
return expanded;
}
public void setExpanded(boolean expanded) {
this.expanded = expanded;
}
}
Может ли кто-нибудь понять, что я делаю здесь неправильно, чтобы мой расширенный извлеченный / кэшированный макет не отображался всегда? Заранее спасибо