【发布时间】:2019-05-29 17:38:18
【问题描述】:
我正在尝试在用户滚动列表时更新 listView 列表,并为用户提供继续和滚动新条目的选项,但没有成功,我需要帮助。
在我的应用程序中,我有一个聊天记录,我正在 SQLite 中保存聊天记录。当用户进入聊天时,应用程序只读取最后 25 条消息,并在列表底部显示最新消息。 为此,我在 XML 中使用以下选项:
android:transcriptMode="alwaysScroll"
android:stackFromBottom="true"
它工作正常。 现在,当用户开始向上滚动并检查聊天历史记录时,当他到达列表顶部时,我正在访问数据库并检索另外 25 条消息并将它们添加到列表顶部,我我呼吁: chatAdaptor.notifyDataSetChanged();
但是当用户试图向上滚动时,什么都不会显示,只有在再次向下和向上滚动后才会显示新条目。
我尝试使用 setSelection 和 smoothScrollToPosition 设置列表视图的位置,但它并没有真正起作用。
它如何用新条目更新列表并让用户选择继续并向上滚动?
这里是相关代码:
<ListView
android:id="@+id/chatList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="bottom"
android:layout_margin="2dp"
android:layout_weight="1"
android:transcriptMode="alwaysScroll"
android:stackFromBottom="true"
android:background="@drawable/frame_tab"></ListView>
public void showChatLines() {
chatLinesView = chatTextDialog.findViewById(R.id.chatList);
chatAdaptor = new GenericAdapter<ChatLine>(activity, chatLines) {
@Override
public View getMyView(int position, View convertView, ViewGroup parent, ChatLine chatLine) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.chat_line, null);
TextView chatLineText = view.findViewById(R.id.chatLine);
chatLineText.setText(chatLine.messageText);
TextView chatLineTime = view.findViewById(R.id.chatLineTime);
chatLineTime.setText(chatLine.displayDateTime);
TextView chatLineUserName = view.findViewById(R.id.userName);
chatLineUserName.setText(chatLine.userDisplayName);
chatLineUserName.setTextColor(activity.getColor(Constants.colors[getColorBy(chatLine.userName)]));
LinearLayout chatLineLayout = view.findViewById(R.id.chatLineLayout);
LinearLayout.LayoutParams chatLineLayoutParams = (LinearLayout.LayoutParams) chatLineLayout.getLayoutParams();
CardView chatLineBackground = view.findViewById(R.id.chatLineBackground);
LinearLayout.LayoutParams chatLineBackgroundParams = (LinearLayout.LayoutParams) chatLineBackground.getLayoutParams();
LinearLayout chatLineSubLayout = view.findViewById(R.id.chatLineSubLayout);
FrameLayout.LayoutParams chatLineSubLayoutParams = (FrameLayout.LayoutParams) chatLineSubLayout.getLayoutParams();
if (chatLine.userName.equals(logonUserName)) {
CardView charLineCard = view.findViewById(R.id.chatLineBackground);
charLineCard.setCardBackgroundColor(activity.getColor(R.color.focusedColor));
((ViewGroup) chatLineUserName.getParent()).removeView(chatLineUserName);
} else {
chatLineLayoutParams.gravity = Gravity.RIGHT;
chatLineLayout.setLayoutParams(chatLineLayoutParams);
chatLineSubLayoutParams.gravity = Gravity.RIGHT;
chatLineSubLayout.setLayoutParams(chatLineSubLayoutParams);
chatLineBackgroundParams.gravity = Gravity.RIGHT;
chatLineBackground.setLayoutParams(chatLineBackgroundParams);
}
if (position==0 & fromLine!=0) {
getNextChatLinesFromDb(position);
}
return view;
}
};
chatLinesView.setAdapter(chatAdaptor);
}
private void getNextChatLinesFromDb(int position) {
toLine = fromLine - 1;
fromLine -= pageSize;
if (fromLine < 0) {
fromLine = 0;
}
ArrayList<ChatLine> newChatLines = db.getChatLines(chatRoomId, fromLine, toLine);
chatLines.addAll(0, newChatLines);
chatAdaptor.notifyDataSetChanged();
}
【问题讨论】:
-
能否请您发布您的代码?
-
我已经添加了相关代码。