当ListView的大小发生变化时,保持ListView的最后一个可见项

Dam*_*les 31 layout android listview

我想要的很简单,至少我认为这很简单.我只想要一个窗口,其中EditText位于屏幕的底部,其余的空间用ListView填充.不幸的是,它没有像我预期的那样工作.我想要的是下图.有没有简单的方法在XML中执行此操作,还是应该为此编写一些特殊代码? 我想要的是

我有问题的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 >
Run Code Online (Sandbox Code Playgroud)

soo*_*j.e 19

你想要什么

没有键盘的最后可见项目

没有键盘的最后可见项目

带键盘的最后一个可见项目

带键盘的最后一个可见项目

最后可见项目输入较大

最后可见项目输入较大

我是怎么做到的.

摘要

  • 在列表视图中设置android:stackFromBottom ="true"android:transcriptMode ="alwaysScroll"
  • 在Activity中设置android:windowSoftInputMode ="adjustPan"
  • 调用adapter.notifyDataSetChanged(); 添加新聊天时,列表视图将始终滚动到最后一个位置
  • 在EditText中设置android:inputType ="textMultiLine"&android:maxLines ="4"以增长文本框

细节

活动

<activity android:name="MainActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan"></activity>
Run Code Online (Sandbox Code Playgroud)

聊天视图

<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>
Run Code Online (Sandbox Code Playgroud)


Gor*_*cyn 7

我想你可能想在显示键盘之前使用AdapterView.getLastVisiblePosition().

两个解决方案:

  • 在EditText上单击
  • 感谢OnScrollListener(及其onScroll函数)监听ListView

然后使用AdapterView.setSelection在EditText焦点后跳转到此项(或索引 - 2或索引 - 3).

  • 作为唯一理解这个问题的人,获得了赏金.我已经尝试过使用OnScrollListener,并使用OnLayoutChangeListener来检测键盘的外观.我又去了,我仍对结果不满意.似乎不可靠的SetSelection()和smoothScrollToPosition()等:-(我想我可能不得不放弃这个UI. (2认同)