Заполненный Firebase элемент RecyclerView onClick не всегда работает - PullRequest
0 голосов
/ 30 апреля 2020

При разработке приложения 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;
    }
}

Может ли кто-нибудь понять, что я делаю здесь неправильно, чтобы мой расширенный извлеченный / кэшированный макет не отображался всегда? Заранее спасибо

1 Ответ

0 голосов
/ 30 апреля 2020
title.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    healthTips.get(getAdapterPosition()).setExpanded(
                                   !healthTips.get(getAdapterPosition()).isExpanded());
                    notifyItemChanged(getAdapterPosition());
                }
            });

Попробуйте установить значение вот так и отметьте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...