Я пытаюсь обновить список 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();
}