Рад это видеть! знак равно

м приложении у меня естьListView, Данные для каждого элемента в списке являются экземпляромSomeItem класс. В списке есть кастомArrayAdapter который имеет пользовательский вид для отображения различных полей каждого элемента и переопределяетgetView() метод. Скелетный код для инициализации представления списка:

ListView listView = (ListView) foo.getViewById(R.id.listView);

ArrayAdapter<SomeItem> adapter = new ArrayAdapter<SomeItem>(activity, R.layout.listItemView, R.id.textView) {
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // Code to build the view with multiple child views
    }
}

Теперь предположим, у меня естьSomeItem экземпляр. Его связанный вид может или не может быть в частиListView который показан на экране. Если это не так, как я могу получитьListView прокрутить этот конкретный элемент в поле зрения?

Единственный похожий метод, который я нашел, этоListView#requestChildRectangleOnScreen(), что требует от меня предоставления детского представления, которого у меня нет. У меня есть предмет для адаптера. Так что я все еще не уверен, как собрать это воедино. Есть указатели?

 Reaz Murshed06 окт. 2017 г., 00:37
Вопрос не очень понятен. Можете ли вы показать нам что-то, что выражает ваши требования в графической форме?
 user14940806 окт. 2017 г., 10:43
Там могут быть разные способы определения этого, и это не на 100% определенно. Тем не менее, решение принимается на уровне, где список элементов заполнен, и код будет возвращатьSomeItem экземпляр. Теперь мне просто нужно показать его.
 user14940806 окт. 2017 г., 01:20
Я отредактировал вопрос. Это теперь понятнее?
 Reaz Murshed06 окт. 2017 г., 07:26
Как вы будете определять, какой элемент должен быть на экране? Какая у вас логика?

Ответы на вопрос(1)

Решение Вопроса

Рассчитать положениеSomeItem элемент, который вы хотите сделать видимым. Вы можете сделать это, перебирая списокSomeItemс, что вы передаете на адаптер.

использованиеlistView.getFirstVisiblePosition(), listView.getLastVisiblePosition() и вычисленная позиция, чтобы проверить, виден ли элемент в списке.

Если предмет не виден, сделайтеlistView выделите его, позвонивlistView.smoothScrollToPosition(calculatedPosition).

 user14940806 окт. 2017 г., 11:16
Спасибо, выглядит многообещающе. Я буду поддерживать; Принятие будет следовать, как только я успешно попробую. Глядя на API, естьArrayAdapter#getPosition() который должен вернуть позицию, поэтому я думаю, что мне не понадобится итератор. Кроме того, действительно ли мне нужно сделать # 2 или прокручивается к элементу, который уже находится в поле зрения, как настоящий no-op (то есть список не будет перемещаться вообще, в отличие от элемента, перемещающегося в положение по умолчанию)?
 Dmitry Akishin22 окт. 2017 г., 19:52
Рад это видеть! знак равно
 user14940822 окт. 2017 г., 18:54
Я попытался это кратко: прокрутил до верхней части представления списка, выбрал элемент в нижней части экрана (часть на экране составляет менее половины списка) и ждал, пока список не заполнится. Не дергайтесь, пока новые элементы не начнут выталкивать выделение за пределы экрана, после чего оно переместится в нижнюю часть экрана и останется там. Именно то, что мне нужно!
 Dmitry Akishin06 окт. 2017 г., 15:50
Я действительно не помню, какsmoothScrollToPosition() работает с уже отображаемым элементом - это может привести к небольшому искажению, чтобы поместить его в качестве верхнего элемента. Возможно, нет. Или, может быть, это именно то, что вы хотите. Так что попробуйте прокрутку безшаг 2 и посмотрим, удовлетворит ли вас результат.

Ваш ответ на вопрос