Отслеживать пользовательские впечатления от просмотра элементов в 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 после связывания представления с переменной.
Я надеюсь, что это будет работать для вашего требования.
Дайте мне знать ваши отзывы.