Отслеживать пользовательские впечатления от просмотра элементов в Android ListView

У меня есть ListView с набором детей в вертикальном списке (Просмотр объектов) для просмотра пользователями. Я должен отслеживать мнения пользователей, скажем, а. Если пользователь просматривает набор предметов в течение примерно 1 секунды, я должен отслеживать показы. б. Если тот же пользователь прокручивает элементы из окна просмотра и возвращается обратно, я должен снова отслеживать, если он просматривал в течение 1 секунды.

Я пробовал несколько вариантов, таких как getGlobalVisibleRect(), getLocalVisibleRect(), getLocationOnScreen() и они сбивают с толку в первую очередь и не помогли мне получить правильные координаты и видимость дочерних элементов listView,

Я проверил Отслеживание показов элементов в ListView Android, что немного похоже на мое требование, но я подумал, чтобы проверить, есть ли лучшее решение. Я новичок в Android и прошу прощения, если мне неясны некоторые объяснения

1 ответ

Чтобы получить желаемый результат, я думаю, у нас есть два разных решения. Сначала создайте Обработчик для каждого элемента и вызывайте / удаляйте в представлении прокрутки, если он виден. Но это очень глупо, так как создание такого количества обработчиков сделает жизнь вашего приложения адом.

Второй и лучший способ - использовать вызов / удаление одного обработчика для всех видимых элементов. Если оно сохраняется какое-то время "секунда" (1 секунда для вас), используйте количество показов в каждом классе модели вашего элемента и увеличьте его с помощью оператора ++.

Вы можете добавить слушателя прокрутки в вашем списке. Сценарий будет похож на

 ListView listView = null;
int firstVisibleItemIndex = 0;
int visibleCount = 0;

Handler handler = new Handler();
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        for (int i = firstVisibleItemIndex; i < firstVisibleItemIndex + visibleCount; i++) {
            try {
                //Get impression count from model for the visible item index i
                int count = modelList.get(i).getImpressionCount();
                //Set impression count to the model for the visible item index i
                modelList.get(i).setImpressionCount(++count);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
};

//Can call this method body in onCreate directly
private void addListScrollListener() {
    listView.setOnScrollListener(new AbsListView.OnScrollListener() {
        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            // You cat determine first and last visible items here
            // final int lastVisibleItem = firstVisibleItem + visibleItemCount - 1;

            handler.removeCallbacks(runnable);
            firstVisibleItemIndex = firstVisibleItem;
            visibleCount = visibleItemCount;
            handler.postDelayed(runnable, 1000);
        }

        @Override
        public void onScrollStateChanged(AbsListView arg0, int arg1) {
            // TODO Auto-generated method stub
        }
    });
}

Я предполагаю, что вы свяжете свой ListView с идентификатором в вашем методе onCreate. Также вы можете вызвать функцию слушателя в вашем onCreate после связывания представления с переменной.

Я надеюсь, что это будет работать для вашего требования.

Дайте мне знать ваши отзывы.

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