Android: сделайте вид сверху списка прокрутки вместе со списком

У меня есть список, который явно прокручивается. Список содержит некоторые вопросы формы. После того, как пользователь отправит форму, мы помещаем в виде списка вид, похожий на печать, поверх списка (и не позволяем пользователю отвечать на вопросы, но здесь это неважно).

Штамп должен отображаться в верхней части списка (как в верхней части экрана) и прокручиваться с той же скоростью, что и список, т. Е. Он должен исчезать, когда элементы списка, которые первоначально находились под ним, исчезают в верхней части экрана, когда прокручивается.

Любая идея, как этого достичь?

Я нашел решение. Не уверен, что он слишком изящный, но он работает, поэтому он оставит его, если кто-то не придумает что-то лучше.

Представление, которое я хочу просмотреть вместе со списком, представляет собой настраиваемое представление, которое должно знать о представлении списка. Поэтому я реализую на нем метод setListView (ListView listView):

private int scrollY; //1 private Map<Integer, Integer> listViewItemHeights = new Hashtable<>(); public void setListView(final ListView listView) { listView.setOnScrollListener(new OnScrollListener() { //2 @Override public void onScrollStateChanged(AbsListView view, int scrollState) {} //3 @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //4 View c = listView.getChildAt(0); if (c != null) { int oldScrollY = scrollY; scrollY = -c.getTop(); listViewItemHeights.put(listView.getFirstVisiblePosition(), c.getHeight()); for (int i = 0; i < listView.getFirstVisiblePosition(); ++i) { if (listViewItemHeights.get(i) != null) scrollY += listViewItemHeights.get(i); } scrollBy(0, scrollY - oldScrollY); } } }); } 

Комментарий №1: это переменная, позволяющая мне отслеживать текущую позицию прокрутки.

Комментарий № 2: установка нового на прослушивателе прокрутки, чтобы мой пользовательский вид знал, когда список

Комментарий № 3: в этом случае это не нужно.

Комментарий № 4: здесь происходит магия. Обратите внимание, в конце я прокручиваю свое представление с помощью scrollY – oldScrollY, позвольте мне сначала начать с этого бита. OldScrollY – сохраненная позиция прокрутки, scrollY – новая. Мне нужно прокрутить разницу между ними. Что касается вычисления scrollY, я отсылаю вас к моему ответу здесь: Android получает точную позицию прокрутки в ListView , так как позиция прокрутки вычисляется в виде списка.

Для просмотра верхнего экрана вы можете добавить headerview, поэтому привяжите компост coustom как headerlayout listview … так что вы прокручиваете то же самое, что и listview …

 View headerview = ((LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.track_footer_view, null, false); listview.addHeaderView(headerview);