以下是聊天屏幕的要求: 1.)屏幕出现时默认显示上一条消息。 2.)如果我在最后一个消息框中,并单击消息框内部,则应向上滚动消息框,并在此框上方显示最后一条消息。标题不应该消失。 3.)如果我在聊天消息之间,并在消息框内单击,则只有消息框应位于键盘的上方,而不是消息列表。请记住,标题应该在所有情况下都可见。标题是RelativeLayout。
以下是分析要求所需的部分屏幕:
以下是我正在处理softkeypad行为的一部分代码:
以下是与以下内容相关的代码: 这是sendbox OnClick的代码:
case R.id.editEmojicon : {
if (messagesItems != null && messagesItems.size() > 0) {
currentMessageID = adapter.getCurrentMessageID();
lastMessageID = messagesItems.get(messagesItems.size() - 1).getMessageId();
if (lastMessageID.equalsIgnoreCase(currentMessageID))// i.e. We are on last message so scroll screen to last and last should be upside of message box
{
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
} else // We are not on last message so don't scroll the screen
{
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
}
break;
}
答案 0 :(得分:0)
您应将标题对齐到顶部,将聊天栏(使用编辑文本)对齐到底部,并将layout_above和layout_below设置为滚动视图,如下所示:
<RelativeLayout
...
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<RelativeLayout
android:layout_alignParentTop="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/header"
>
...
</RelativeLayout>
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_above="@+id/chat_bar"
android:layout_below="@+id/header"
>
</ScrollView>
<RelativeLayout
android:id="@+id/chat_bar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
>
<EditText
android:layout_width="200dp"
android:layout_height="wrap_content"
/>
</RelativeLayout>
</RelativeLayout>
希望有所帮助。
编辑: 对于滚动行为,您可以存储listView ScrollListener
中显示的最后一项 mList.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
lastItemPosition = firstVisibleItem+visibleItemCount;
}
});
然后通过在显示键盘时滚动到hist位置来设置最后一项
mList.setSelectionFromTop(mLastItemPosition, mList.getHeight()- mList.setSelectionFromTop(mLastItemPosition, mList.getHeight()- mList.getAdapter().getView(mLastItemPosition,null,mList).getHeight());
答案 1 :(得分:0)
事实证明它很容易实现。当您使用listView作为列表时,请在初始化后添加以下行:
lv_chat.setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);
lv_chat.setStackFromBottom(true);
其中lv_chat
是您的ListView对象!
第一行确保当新数据进入时,它会自动滚动到底部。
第二行强制列表视图从底部绘制。
这些都将涵盖您的所有要求。
这是一个和平滚动列表的帮助方法,以防你试图显式滚动:
public void scrollDown() {
lv_chat.post(new Runnable() {
@Override
public void run() {
lv_chat.setSelection(chatListAdapter.getCount() - 1);
}
});
}
希望它有所帮助! :)