Maintain scroll position when adding to ListView with reverse endless-scrolling

后端 未结 4 1799
不知归路
不知归路 2021-02-05 10:38

I am building a chat-like Android application, similar to Hangouts. For this purpose I am using a vertical ListView with stackFromBottom=true and transcriptMo

相关标签:
4条回答
  • 2021-02-05 10:46

    after you insert the record in your adapter you can try to use

       yourListView.setSelection(yourAdapter.getCount() - 1);
    
    0 讨论(0)
  • 2021-02-05 10:59

    Edit to account for additional information:

    I think I've found your issue. I replicated your described use cases by using a standalone list as the only view in XML:

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </ListView>
    

    I fixed the problem to follow your desired use cases by nesting the layout in a parent layout:

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
        <ListView
            android:id="@+id/list"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
        </ListView>
    
    </FrameLayout>
    
    0 讨论(0)
  • 2021-02-05 11:00

    I have figured this out. Wherever it is that you are getting new data I call the following before changing data in the adapter:

    int firstVisibleItem = list.getFirstVisiblePosition();
    int oldCount = adapter.getCount();
    View view = list.getChildAt(0);
    int pos = (view == null ? 0 :  view.getBottom());
    

    Then I call:

    adapter.setData(data);
    
    list.setSelectionFromTop(firstVisibleItem + adapter.getCount() - oldCount + 1, pos);
    
    0 讨论(0)
  • 2021-02-05 11:05

    First get the firstVisiblePosition (or the Last one since its upside down. Yo got to try and check it yourself) and then get the top of the View which is added to the List and then using setSe;ectionFromTop() method, you can scroll to the desired location.

    Code:

    int index = mList.getFirstVisiblePosition();
    View v = mList.getChildAt(0); //or upside down (list.size - 1)
    int top = (v == null) ? 0 : v.getTop(); //returns the top of the view its Y co-ordinates. [Doc][1]
    mList.setSelectionFromTop(index, top);
    

    Source.

    0 讨论(0)
提交回复
热议问题