Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ListView在更新后会滚动到顶部_Android_Listview_Scroll_Autoscroll - Fatal编程技术网

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()