Показывать последний элемент в ListiView, когда вы нажимаете на текст редактирования

в настоящее время я делаю это, чтобы получить фокус последнего элемента в списке после нажатия на текст редактирования:

    bodyText.setOnFocusChangeListener(new OnFocusChangeListener() {

        public void onFocusChange(View v, boolean hasFocus) {               
            getListView().setSelection(getListView().getCount());
        }
    });

    bodyText.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {
            getListView().setSelection(getListView().getCount());
        }
    });

Он отлично работает и захватывает последний элемент, проблема заключается в том, что появляется программная клавиатура, которая закрывает последние 3 элемента в списке. Есть ли способ показать последний элемент ПОСЛЕ появления программной клавиатуры и изменения размера экрана? Спасибо!


person Maurice    schedule 16.03.2011    source источник


Ответы (4)


Я сделал свой собственный пользовательский ListView следующим образом:

public class CustomListView extends ListView {

public CustomListView (Context context) {
    super(context);
}

public CustomListView (Context context, AttributeSet attrs) {
    super(context, attrs);
}

public CustomListView (Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld) {
    super.onSizeChanged(xNew, yNew, xOld, yOld);

    setSelection(getCount());

}
}

Вы должны включить все 3 конструктора, иначе будет выдано исключение.

Затем в XML, где вы обычно размещаете

Список

android:id="@+id/android:list"
android:layout_width="fill_parent" 
android:layout_height="fill_parent"

Измените ListView на com.blah.blah.CustomListView.

Извините за сумбурное оформление, почему-то не могу заставить форматтер нормально работать.

Запустите ваше приложение. Теперь, когда вы нажимаете на EditText, он показывает последний элемент ПОСЛЕ отображения программной клавиатуры! Обратите внимание, что существуют некоторые ограничения, например, когда функция автозаполнения появляется при вводе текста в EditText, она также отображает последний элемент из-за изменения размера ListView.

Наслаждаться!

person Maurice    schedule 17.03.2011

Решение, предложенное @Maurice, почти правильное (или, по крайней мере, оно почти работает для меня). Мне пришлось изменить метод onSizeChanged, чтобы поместить setSelection в вызов для публикации следующим образом:

@Override
protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld) {
    super.onSizeChanged(xNew, yNew, xOld, yOld);

    post(new Runnable() {
        public void run() {
            setSelection(getCount());
        }
    });
}

Согласно документации, опубликуйте «Вызывает добавление Runnable в очередь сообщений. Runnable будет запущен в потоке пользовательского интерфейса». Этот метод также используется в некоторых источниках Android AbsListView.

person esilver    schedule 07.05.2012
comment
У меня только один вопрос, почему вы не используете getCount()-1? - person meh; 21.10.2012
comment
В моей фактической реализации я записываю индекс последнего нажатого элемента и прокручиваю его. Вы можете использовать getCount()-1 или любой другой подход, подходящий для вашей реализации. - person esilver; 22.10.2012
comment
так как индекс источника данных начинается с 0. скажем, например, список или массив. - person meh; 22.10.2012

Использовать

<activity
.....
android:windowSoftInputMode="adjustResize" />

в вашем файле манифеста.

person Sunil Pandey    schedule 16.03.2011
comment
‹activity android:name=.MessageList android:theme=@style/TallTitle android:windowSoftInputMode=stateHidden|adjustResize› ‹/activity› У меня это уже есть в манифесте, не работает. - person Maurice; 16.03.2011

Для тех, кто работает с новым виджетом RecyclerView, рекомендуется:

так же, как принятый ответ, но заменить:

setSelection(getCount());

с этим:

 (LinearLayoutManager)getLayoutManager())
.scrollToPositionWithOffset(getAdapter().getItemCount() - 1, 0);

только у LinearLayoutManagerи StaggeredGridLayoutManager есть этот метод. так что используйте это LayoutManagers.

person David    schedule 13.07.2016