Android ListView在更新后会滚动到顶部
我有一个Android ListView在更新后会滚动到顶部,android,listview,scroll,autoscroll,Android,Listview,Scroll,Autoscroll,我有一个mChildEventListener,它从Firebase数据库中查询第一个n项目和另一个mChildEventListener2(当用户向上滚动并单击加载更多按钮时触发)查询下一个n项目并将其添加到聊天信息列表中 当用户单击加载更多按钮时:更新聊天信息列表,并调用notifyDataSetChanged。mMessageListView会更新,但每次都会向下滚动到按钮。我解释这种行为是因为xml属性:android:transcriptMode=“alwaysScroll” 当我删除
mChildEventListener
,它从Firebase数据库中查询第一个n项目和另一个mChildEventListener2
(当用户向上滚动并单击加载更多
按钮时触发)查询下一个n项目并将其添加到聊天信息列表中
当用户单击加载更多
按钮时:更新聊天信息列表
,并调用notifyDataSetChanged
。mMessageListView
会更新,但每次都会向下滚动到按钮。我解释这种行为是因为xml属性:android:transcriptMode=“alwaysScroll”
当我删除transcript mode=“alwaysScroll”
并且用户按下Load More
按钮时,mMessageListView
这次会滚动到顶部
这些行为都是不需要的。我希望当用户按下按钮时,mMessageListView
将保持其“滚动位置”。(理由显而易见)
我尝试从一个新线程调用notifydatasetchange
。没有结果
我尝试使用listView.setSelectionFromTop(lastViewedPosition,topOffset)代码>或使用list.smoothScrollToPosition()代码>但没有一个能获得我想要的流畅体验
更新mMessageListView
后,如何保持滚动位置?
代码如下:
private ChildEventListener mChildEventListener;
private ChildEventListener mChildEventListener2;
List<ChatMessage> ChatMessages = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
...
mMessageAdapter = new MessageAdapter(this, R.layout.item_message_sent, ChatMessages);
mMessageListView.setAdapter(mMessageAdapter);
mChildEventListener = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
if(i == 0) {
current_last_key = dataSnapshot.getKey();
}
else {
ChatMessage chatMessage = dataSnapshot.getValue(ChatMessage.class);
mMessageAdapter.add(chatMessage);
}
i++;
}
...
};
Query messagesQuery = mDatabaseReference.child("chat_messages").
child(chatId).limitToLast(25);
messagesQuery.addChildEventListener(mChildEventListener);
...
}
@Override
public void onClick(View v) {
j = 0;
mChildEventListener2 = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
if(!dataSnapshot.getKey().equals(current_last_key)) {
if (j == 0) {
current_last_key = dataSnapshot.getKey();
}
else {
ChatMessage chatMessage = dataSnapshot.getValue(ChatMessage.class);
ChatMessages.add(j- 1, chatMessage);
}
}
else
{
ChatMessage chatMessage = dataSnapshot.getValue(ChatMessage.class);
ChatMessages.add(0 , chatMessage);
loadMoreTextView.setVisibility(View.GONE);
}
mMessageAdapter.notifyDataSetChanged();
j++;
}
... };
Query query = mDatabaseReference.child("chat_messages").
child(chatId).orderByKey().endAt(current_last_key).limitToLast(10);
query.addChildEventListener(mChildEventListener2);
}
private ChildEventListener-mChildEventListener;
private ChildEventListener McHildEventListener 2;
List ChatMessages=new ArrayList();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
...
mMessageAdapter=新消息适配器(this,R.layout.item_message_sent,ChatMessages);
设置适配器(mMessageAdapter);
mChildEventListener=new ChildEventListener(){
@凌驾
公共void onChildAdded(DataSnapshot DataSnapshot,字符串s){
如果(i==0){
当前_last_key=dataSnapshot.getKey();
}
否则{
ChatMessage ChatMessage=dataSnapshot.getValue(ChatMessage.class);
mMessageAdapter.add(聊天信息);
}
i++;
}
...
};
Query messagesQuery=mDatabaseReference.child(“聊天信息”)。
儿童(chatId),利米托拉斯(25);
addChildEventListener(mChildEventListener);
...
}
@凌驾
公共void onClick(视图v){
j=0;
mChildEventListener2=新的ChildEventListener(){
@凌驾
公共void onChildAdded(DataSnapshot DataSnapshot,字符串s){
如果(!dataSnapshot.getKey().equals(current_last_key)){
如果(j==0){
当前_last_key=dataSnapshot.getKey();
}
否则{
ChatMessage ChatMessage=dataSnapshot.getValue(ChatMessage.class);
添加(j-1,chatMessage);
}
}
其他的
{
ChatMessage ChatMessage=dataSnapshot.getValue(ChatMessage.class);
添加(0,chatMessage);
loadMoreTextView.setVisibility(View.GONE);
}
mMessageAdapter.notifyDataSetChanged();
j++;
}
... };
Query Query=mDatabaseReference.child(“聊天信息”)。
child(chatId).orderByKey().endAt(当前最后一个键).limitToLast(10);
addChildEventListener(mChildEventListener2);
}
通知附加的观察者基础数据已更改,任何反映数据集的视图都应刷新自身
尝试查看在更新时是否再次调用了“onCreate()”为您处理所有这些问题并简化代码。
顺便说一句,您可以使用mAdapter.notifyItemInserted(ChatMessages.size()-1)
或mMessageAdapter.notifyItemRangeInserted(ChatMessages.size()-1,ChatMessages.size()-1+numberOfItemsBeingInserted)编码>并进行其他必要的更改以使其正常工作,而不是使用mMessageAdapter.notifyDataSetChanged()代码>你是说FirebaseUI库处理数据分页?是的!只需使用FirebaseIndexRecyclerAdapter(类modelClass、@LayoutRes int modelLayout、类viewHolderClass、查询键Query、数据库引用dataRef)
constructor而不是FirebaseRecyclerAdapter(Food.class,R.layout.card\u view\u Food,FoodCardViewHolder.class,foodInfoRef)
仍然,使用FirebaseIndexRecyclerAdapter
需要我索引我的ChatMessages
,这是我一直避免的事情。我已经对我的数据进行了分页,我只是在列表视图中遇到了问题,我看不到相关性。请详细说明
notifyDataSetChanged()