Как обновить дочернее значение в firebase, когда элемент просмотра recyclerview попадает в область экрана?

Я хочу обновить дочернее значение, когда пользователь получит доступ к каждому элементу просмотра recyclerview.

Предположим, у меня есть узел «Пользователи» в базе данных firebase. и у него есть три дочерних элемента с именами «Название», «Описание» и «количество», как это

{
Users:
 "UID":
    "Title":"..."
    "Description":"..."
    "count":"..."
{

И чтобы получить значение этого дочернего элемента, я реализую код

@Override
            protected void onBindViewHolder(ViewHolder holder, final int position, Model model) {
                holder.setTxtTitle(model.getmTitle());
                holder.setTxtDesc(model.getmDesc());

                holder.root.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Toast.makeText(MainActivity.this, String.valueOf(position), Toast.LENGTH_SHORT).show();
                    }
                });
            }

Теперь я хочу обновить значение «счетчика», ТОЛЬКО КОГДА элемент просмотра появляется на экране. Предположим, у меня есть 5 узлов UID в узле Users, поэтому я получу 5 itemview. когда пользователи загружают эти все 5 uid

если пользователь В НАСТОЯЩЕЕ ВРЕМЯ видит 1 элемент, обновите только его дочернее значение «count». если пользователь В НАСТОЯЩЕЕ ВРЕМЯ видит 2 элемента, чем обновить только дочернее значение «count».

Короче говоря, значение «Количество» изменяется только тогда, когда при прокрутке на экране появляется элемент.

Я не уверен, что именно вы хотите, но я предполагаю, что есть список UID, и каждый UID является элементом RecyclerView. Теперь у меня есть вопрос, хотите ли вы обновить значение счетчика для каждого элемента на экране видимости или после использования взаимодействия с пользователем, такого как событие щелчка или что-то в этом роде? Если на экране видимость, то будет ли значение счетчика UID обновляться каждый раз, когда прокрутка будет переносить элемент в область видимости экрана при прокрутке вверх и вниз?

Hari N Jha 07.06.2019 12:52

да, это именно то, что я прошу

Vora 07.06.2019 12:55

Я хочу обновить значение счетчика для каждого элемента на экране видимости

Vora 07.06.2019 12:57

@Hari N Jha, пожалуйста, помогите

Vora 07.06.2019 13:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я попытался представить логику, но у меня не было возможности запустить ее. Я пытался писать в редакторе notepad ++, поэтому не уверен, что синтаксическая ошибка будет отображаться в AndroidStudio, но логика будет аналогична этой.

private RecyclerView list;

private adapter recyclerAdapter;

private LinearLayoutManager layoutManager;

private int visibleItemCount, totalItemCount, firstVisibleItemPosition, lastVisibleItem;
private int oldFirstVisibleItemPos = -1, oldLastVisibleItemPos = -1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_recycler_view5);
    recView = (RecyclerView) findViewById(R.id.list);

    layoutManager = new LinearLayoutManager(this);
    recView.setLayoutManager(layoutManager);
    recyclerAdapter = new adapter(RecyclerViewActivity5.this, country);
    recView.setAdapter(recyclerAdapter);
    recView.addOnScrollListener(onScrollListener);

    firstVisibleItemPosition = layoutManager.findFirstCompletelyVisibleItemPosition();
    lastVisibleItem = layoutManager.findLastCompletelyVisibleItemPosition();
    updateVisibleItem();
}

private RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
    }
    @Override
    public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        visibleItemCount = layoutManager.getChildCount();
        totalItemCount = layoutManager.getItemCount();
        firstVisibleItemPosition = layoutManager.findFirstCompletelyVisibleItemPosition();
        lastVisibleItem = firstVisibleItemPosition +visibleItemCount;
        Toast.makeText(RecyclerViewActivity5.this, "Visible Item Total:"+String.valueOf(visibleItemCount), Toast.LENGTH_SHORT).show();

        updateVisibleItem();
    }
};

private void updateVisibleItem() {
    if (oldFirstVisibleItemPos == -1 && lastVisibleItem == -1) {
        oldFirstVisibleItemPos = firstVisibleItemPosition;
        oldLastVisibleItemPos = lastVisibleItem;
    } else if (firstVisibleItemPosition < oldFirstVisibleItemPos){

        if (lastVisibleItem < oldFirstVisibleItemPos)
            oldLastVisibleItemPos = lastVisibleItem;
        else
            oldLastVisibleItemPos = oldFirstVisibleItemPos -1;

        oldFirstVisibleItemPos = firstVisibleItemPosition;
    } else {
        if (firstVisibleItemPosition > oldLastVisibleItemPos)
            oldFirstVisibleItemPos = firstVisibleItemPosition;
        else
            oldFirstVisibleItemPos = oldLastVisibleItemPos + 1;
        oldLastVisibleItemPos = lastVisibleItem;
    }

    for(int i = oldFirstVisibleItemPos; i <= oldLastVisibleItemPos; i++) {
        Model model = list.get(i);
        model.setCount(model.getCount() + 1);
    }
}

Здесь список — это представление списка вашей модели, и каждая модель будет иметь счет как переменную. Метод updateVisibleItem() используется для обновления счетчика элементов путем исключения перекрывающихся видимых элементов экрана.

Я надеюсь, что это поможет вам выполнить ваше требование.

Другие вопросы по теме