Сохранение последнего видимого элемента ListView при изменении размера ListView - PullRequest
31 голосов
/ 19 февраля 2012

То, что я хочу, просто, по крайней мере, я думал, что это будет просто.Я просто хочу окно, где EditText находится в нижней части экрана, а остальное пространство заполнено ListView.К сожалению, это не сработало, как я ожидал.То, что я хочу, это следующее изображение.Есть ли простой способ сделать это в XML, или я должен написать какой-то специальный код для этого?What I want

Исходный код моего проблемного Android.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView
    android:id="@+id/demolist"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1"
     >
</ListView>
    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:layout_weight="0">
    </EditText>
</LinearLayout >

Ответы [ 12 ]

19 голосов
/ 26 апреля 2013

Что вы хотите

Последний видимый элемент без клавиатуры

Last Visible Item Without Keyboard

Последний видимый элемент с клавиатурой

Last Visible Item With Keyboard

Последний видимый элемент с большим вводом

Last Visible Item With larger input

Вот как я это сделал.

Краткое описание

  • Установить android: stackFromBottom = "true" и android: transcriptMode = "alwaysScroll" в представлении списка
  • Установить android: windowSoftInputMode = "AdjustPan" в Activity
  • Вызов adapter.notifyDataSetChanged (); при добавлении новых чатов, чтобы представление списка всегда прокручивалось до последней позиции
  • Установить android: inputType = "textMultiLine" & android: maxLines = "4" в EditText для растущего текстового поля

Подробнее

Активность

<activity android:name="MainActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan"></activity>

Просмотр чата

<RelativeLayout
    android:id="@+id/chat_header"
    android:layout_width="fill_parent"
    android:layout_height="40dp"
    android:padding="3dp" >

    <Button
        android:id="@+id/btnBackChat"
        android:layout_width="35dp"
        android:layout_height="35dp"
        android:layout_alignParentLeft="true"
        android:background="@drawable/back_button" />

    <TextView
        android:id="@+id/txt_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/btnBackChat"
        android:layout_centerHorizontal="true"
        android:textColor="@android:color/white"
        android:textSize="18sp" />

    <ImageView
        android:id="@+id/imgViewProfileChat"
        android:layout_width="35dp"
        android:layout_height="35dp"
        android:layout_alignParentRight="true"
        />
</RelativeLayout>

<ListView
    android:id="@+id/listView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_above="@+id/form"
    android:layout_below="@+id/chat_header"
    android:stackFromBottom="true"
    android:transcriptMode="alwaysScroll"/>

<RelativeLayout
    android:id="@+id/form"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:orientation="vertical" >

    <ImageButton
        android:id="@+id/btnAttach"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:contentDescription="@string/attach"
        android:src="@drawable/attach_icon" />

    <EditText
        android:id="@+id/txtChat"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@+id/btnSend"
        android:layout_toRightOf="@+id/btnAttach"
        android:inputType="textMultiLine"
        android:maxLines="4" />

    <Button
        android:id="@+id/btnSend"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:text="@string/send" />
</RelativeLayout>

7 голосов
/ 22 апреля 2013

Я думаю, что вы можете использовать AdapterView.getLastVisiblePosition () перед отображением клавиатуры.

Два решения здесь:

  • на EditText нажмите
  • благодаря OnScrollListener (и его функции onScroll), слушающей ваш ListView

затем используйте AdapterView.setSelection , чтобы перейти к этому элементу (или индексу - 2 или индексу - 3) после фокуса EditText.

3 голосов
/ 11 августа 2016

Просто переопределите метод ListView # onSizeChanged (int w, int h, int oldw, int oldh), как показано ниже: PS: высота вашего ListView не может быть 0 в любое время, если может 0, не работает.1002 *

3 голосов
/ 24 апреля 2013

Вы можете использовать android:windowSoftInputMode="adjustPan" в вашем AndroidManifest.xml, как показано ниже

 <activity android:name="com.example.SimpleListView"
            android:label="@string/app_name"
            android:windowSoftInputMode="adjustPan" >

Это должно дать желаемый результат. Официальная документация для Android .

При желании вы можете указать режим записи (если вы работаете над какой-либо функцией чата) для представления списка, если вы хотите автоматически прокрутить до конца просмотра списка. Вы также можете проверить android:transcriptMode="normal" и посмотреть, подходит ли оно.

Связанный SO ответ . Официальный android doc .

<ListView
android:id="@+id/comments"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:transcriptMode="alwaysScroll">

Это должно решить большинство ваших проблем, возможно, за исключением последней (на рисунке), которую я не проверял.

2 голосов
/ 01 апреля 2014

Я фактически получил то же поведение, что и вам, добавив объявление Activity в манифесте android:windowSoftInputMode="adjustResize" и объявление ListView android:transcriptMode="normal". Для изменения клавиатуры и ориентации.

1 голос
/ 26 апреля 2013

Я создал механизм раскладки для Android, который позволяет вам прослушивать скрытые и видимые изменения состояния клавиатуры (среди многих других основных функций).Эта библиотека доступна по адресу http://phil -brown.github.io / AbLE / .

Просто добавьте jar в каталог libs (создайте эту папку, если она несуществует) и вместо наследования от Activity наследуется от AbLEActivity.Затем переопределите методы onKeyboardShown и onKeyboardHidden, и в них вы можете анимировать просмотр содержимого вверх или вниз по мере необходимости:

@Override
public void onKeyboardShown() {
    //animate up
}

@Override
public void onKeyboardHidden() {
    //animate down
}
1 голос
/ 23 апреля 2013

Вы можете сделать это через xml:

<ListView
    android:stackFromBottom="true"
    android:layout_height=0dp
    android:layout_weight=1 />

Укладка снизу будет прокручивать ListView по умолчанию, установка веса ListView заполнит все возможное пространство внутри родительской вертикали LinearLayout.

1 голос
/ 12 апреля 2013

Мне тоже нужна эта функциональность.Вот моя попытка, но она не совсем работает - прокрутка немного нестабильна (не всегда заканчивается там, где должна) и мешает сохранению положения прокрутки при повороте экрана.

@Override
public void onResume() {
    super.onResume();
    getListView().addOnLayoutChangeListener(stickyLastItemHandler);
}

@Override
public void onPause() {
    super.onPause();
    getListView().removeOnLayoutChangeListener(stickyLastItemHandler);
}

View.OnLayoutChangeListener stickyLastItemHandler = new View.OnLayoutChangeListener() {
    @Override
    public void onLayoutChange(View v,
            int left, int top, int right, int bottom,
            int oldLeft, int oldTop, int oldRight, int oldBottom) {

        final int heightChange = (bottom - top) - (oldBottom - oldTop);
        if (heightChange != 0) {
            ((AbsListView)v).smoothScrollBy(-heightChange, 1000);
        }
    }
};
0 голосов
/ 05 декабря 2015
Follow these steps
--------------------
1. Update your activity in AndroidManifest.xml file like below
<activity
            android:name=".MyListActivity"
            android:windowSoftInputMode="adjustResize" />

2. Set your list view with like below.
mListView.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
mListView.setStackFromBottom(true);

Надеюсь, это решит вашу проблему.

0 голосов
/ 26 апреля 2013

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

private void scrollMyListViewToBottom() {
    myListView.post(new Runnable() {
        @Override
        public void run() {
            // Select the last row so it will scroll into view...
            myListView.setSelection(myListAdapter.getCount() - 1) ;
        }
    });
}

Или вы также можете попробовать это:

ChatAdapter adapter = new ChatAdapter(this);

ListView lview = (ListView) findViewById(R.id.chatList);
lview .setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
lview .setAdapter(adapter);

adapter.registerDataSetObserver(new DataSetObserver() {
    @Override
    public void onChanged() {
        super.onChanged();
        lv.setSelection(adapter.getCount() - 1);    
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...