2010-08-17 5 views
45

У меня есть ListView с текстом редактирования и кнопкой под ним. Когда я нажимаю на элемент listView, появляется клавиатура и нажимает текст редактирования и кнопку. Я хочу, чтобы список переместился к выбранному элементу. Есть идеи? СпасибоListView прокрутка к выбранному элементу

+1

увидеть мой ответ здесь, http://stackoverflow.com/a/29345217/1881527 –

+2

Возможный дубликат [Программным прокручивать в определенную позицию в Android ListView] (HTTP: // StackOverflow.com/questions/7561353/programatically-scroll-to-a-specific-position-in-an-android-listview) –

ответ

4

Настройте прослушиватель на выбранный элемент списка, затем используйте View.getTop() или View.getBottom() при нажатии, чтобы получить его позицию в родительском. Затем вы можете использовать ListView.scrollTo(x, y) для перехода к элементу списка.

+0

Это не работает для меня. Если я реализую ваш пример, listView прокручивается, но выбранный элемент не центрируется. – Anita

+1

@Anita: Вы ничего не говорили о центрировании ... центрирование требует лишь небольшой модификации. Просто добавьте или уменьшите значение y пропорционально высоте экрана. – Doge

+0

Не нужно это делать. –

69

Вы можете использовать метод List12's setSelection(int position) для прокрутки до строки.

+16

Это не сработало для меня. Я использовал smoothScrollToPostion (position) в http://developer.android.com/reference/android/widget/ListView.html#smoothScrollToPosition(int). Важное примечание. Мне пришлось вызвать его после того, как на адаптер был вызван notifyDataSetChanged(). – SilentNot

+1

Обратите внимание, что это приводит вас к позиции, но, как и в другом ответе, на самом деле прокручивается smoothScrollToPosition. Оба работают, если вы хотите, чтобы пользователь был показан что-то, так что это вопрос того, как вы хотите, чтобы он выглядел. –

+0

Как сделать listview прокруткой вверх, когда существует только один элемент? –

4

Вы должны использовать transcript mode:

getListView().setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL); 
42

Вы можете использовать управления ListView smoothScrollToPosition(int position), чтобы перейти к конкретному месту в списке.

+1

из-за этой ошибки: https://code.google.com/p/android/issues/detail?id=36062, это действительно лучшее обходное решение, если вы хотите гладкую прокрутку: http://stackoverflow.com/questions/ 14479078/smoothscrolltopositionfromtop-is-not-always-working-like-it-should/20997828 # 20997828 – nommer

+0

Эта ошибка, как описано, кажется специфичной для smoothScrollToPositionFromTop. Не уверен, что это влияет на smoothScrollToPosition ... кто-нибудь знает? –

+1

Не знаю, но во время моего 'smoothScrollToPosition()' не работает, пока работает 'setSelection()'; хотя с рывком. – Darpan

3

Yo можете посмотреть

listView.setSelectionFromTop (положение, distanceFromHeader);

Это положение элемента в позиции, указанные пиксели ниже верхней части ListView

+0

Мне нужно прокрутить другой вид одновременно, прокручивая lisview. Использование setSelectionFromTop в listview для прокрутки блокирует поток пользовательского интерфейса, который замедляет прокрутку другого представления. Можете ли вы дать какое-то предложение, как это сделать? – VijayRaj

21

Для прямого свитка:

getListView().setSelection(11); 

Для гладкой прокрутки:

getListView().smoothScrollToPosition(11); 

Для перехода к началу

getListView().setSelectionAfterHeaderView(); 

Примечание

пытаются назвать его в должности, потому что когда-то ListView еще не создан, а вы называете это метод

getListView().postDelayed(new Runnable() {   
    @Override 
    public void run() { 
     lst.setSelection(15); 
    } 
},100L); 
1

Использование продолжительность дает лучший пользовательский опыт. Используйте это, с добавленной продолжительностью. Пролистнет элемент в позиции плавно в верхней части списка.

int duration = 500; //miliseconds 
int offset = 0;  //fromListTop 

listview.smoothScrollToPositionFromTop(position,offset,duration); 
  • продолжительность descrease сделать прокрутку быстрее
1

Вы можете использовать

smoothScrollToPosition(position) 

Просто увеличить позицию элемента с 1, и вы получите представление пункта.

getListView().smoothScrollToPosition(position + 1); 
Смежные вопросы