Android recyclerview在notifyDataSetChanged()之后滚动到顶部

Android recyclerview在notifyDataSetChanged()之后滚动到顶部,android,android-recyclerview,adapter,notifydatasetchanged,Android,Android Recyclerview,Adapter,Notifydatasetchanged,我有一个非常奇怪的问题,我试着解决了大约两天。我有一个RecyclerView,它嵌套在NestedScrollView中。我为我的NestedScrollView创建了endlesscrollListener,它可以正确地加载更多数据,但是当我调用notifyDataSetChanged()或notifyItemRangeChanged()我的列表滚动到第二项或另一项的顶部。另外,当我想更新我的SwipeRefreshLayout中的所有项目时,它可能是混合的(例如,第四个项目的图像可能设置在

我有一个非常奇怪的问题,我试着解决了大约两天。我有一个
RecyclerView
,它嵌套在
NestedScrollView
中。我为我的
NestedScrollView
创建了
endlesscrollListener
,它可以正确地加载更多数据,但是当我调用
notifyDataSetChanged()
notifyItemRangeChanged()
我的列表滚动到第二项或另一项的顶部。另外,当我想更新我的
SwipeRefreshLayout
中的所有项目时,它可能是混合的(例如,第四个项目的图像可能设置在第一个项目中,等等)。只有当我想更新项目时,当我第一次打开应用程序时,一切正常时,才会发生这种情况。我不知道为什么会这样,请帮帮我。提前谢谢。我的代码 这是我初始化适配器的函数

private void setFeedRecycler(RecyclerView feedRecyclerView, List<Edge<Activity>> feeds){
    noFeedsTitle.setVisibility(View.GONE);
    feedsArray.addAll(feeds);
    LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
    feedRecyclerView.setHasFixedSize(true);
    feedRecyclerView.setNestedScrollingEnabled(false);
    feedRecyclerView.setLayoutManager(layoutManager);
    feedsDashboardAdapter = new FeedsDashboardAdapter(getActivity(), this, feedsArray, feedRecyclerView, mainDashboardLayout);
    feedsDashboardAdapter.setOnLoadMoreListener(loadMoreListenerFeeds);
    feedRecyclerView.setAdapter(feedsDashboardAdapter);
}
当我想更新我的所有项目时

private SwipeRefreshLayout.OnRefreshListener refreshListener = new SwipeRefreshLayout.OnRefreshListener() {
    @Override
    public void onRefresh() {
        loadAfterCursorFeed = "";
        feedsArray.clear();
        getUserFeeds(user.getAccessToken(), user.getClientId(), loadAfterCursorFeed);
    }
};
loadAfterCursorFeed它就像是数据的下一页的id。 最后是我的适配器

    public FeedsDashboardAdapter(Context context, DashboardFragment fragment, ArrayList<Edge<Activity>> feeds, RecyclerView recyclerView,
                                     NestedScrollView mainDashboardLayout){
            this.feeds = feeds;
            this.context = context;
            this.fragment = fragment;
            this.mainDashboardLayout = mainDashboardLayout;
            this.linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
            this.client = new RestClient().getApiService();
            SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
            user = new Gson().fromJson(sharedPreferences.getString("user", null), User.class );
            mainDashboardLayout.setOnScrollChangeListener(new EndlessParentScrollListener(linearLayoutManager) {
                @Override
                public void onLoadMore(int page, int totalItemsCount) {
                    Log.d(TAG, "page " + page + " totalItemsCount " + totalItemsCount);
                    if (onLoadMoreListener != null) {
                        onLoadMoreListener.onLoadMore();
                    }
                }
            });
        }
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            if (viewType == VIEW_TYPE_USER_FEEDS) {
                View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_user_feed, parent, false);
                return new CategoryUserFeedHolder(layoutView, context);
            } else if(viewType == VIEW_TYPE_SHARE_EVENT) {
                View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_feed_shared_event, parent, false);
                return new CategoryShareEventHolder(layoutView);
            }  else if (viewType == VIEW_TYPE_LOADING) {
                View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.loading_item_layout, parent, false);
                return new LoadingViewHolder(layoutView);
            }
            return null;
        }
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    if (holder instanceof CategoryShareEventHolder) {
    //set necessary field
    }
    else if(holder instanceof CategoryUserFeedHolder){
    //set necessary field
    }
}
    @Override
    public int getItemCount() {
        return this.feeds ==null ? 0 : this.feeds.size();
    }

    @Override
    public int getItemViewType(int position) {
        if (feeds.get(position) == null)
            return VIEW_TYPE_LOADING;
        else if (feeds.get(position).getResponse().getEvent() != null)
            return VIEW_TYPE_SHARE_EVENT;
        return VIEW_TYPE_USER_FEEDS;
    }

    public void setOnLoadMoreListener(OnLoadMoreListener listener){
        this.onLoadMoreListener = listener;
    }
public FeedsDashboardAdapter(上下文上下文、仪表板片段、ArrayList提要、RecyclerView、RecyclerView、,
NestedScrollView主仪表板布局){
this.feed=feed;
this.context=上下文;
this.fragment=片段;
this.mainDashboardLayout=mainDashboardLayout;
this.linearLayoutManager=(linearLayoutManager)recyclerView.getLayoutManager();
this.client=new RestClient().getApiService();
SharedReferences SharedReferences=PreferenceManager.GetDefaultSharedReferences(上下文);
user=new Gson().fromJson(sharedReferences.getString(“user”,null),user.class);
mainDashboardLayout.setOnScrollChangeListener(新EndlessParentScrollListener(linearLayoutManager){
@凌驾
public void onLoadMore(整版页面,整版项目目录){
Log.d(标签,“页面”+页面+“totalItemsCount”+totalItemsCount);
if(onLoadMoreListener!=null){
onLoadMoreListener.onLoadMore();
}
}
});
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
if(viewType==视图类型用户提要){
View layoutView=LayoutFlater.from(parent.getContext()).flate(R.layout.item\u user\u feed,parent,false);
返回新的CategoryUserFeedHolder(布局视图,上下文);
}else if(viewType==视图类型共享事件){
View layoutView=LayoutFlater.from(parent.getContext()).flate(R.layout.item\u feed\u shared\u事件,parent,false);
返回新类别共享文件夹(layoutView);
}else if(viewType==视图类型加载){
View layoutView=LayoutFlater.from(parent.getContext())。充气(R.layout.loading_item_布局,parent,false);
返回新的LoadingViewHolder(layoutView);
}
返回null;
}
@凌驾
BindViewHolder上的公共无效(RecyclerView.ViewHolder,int位置){
if(类别ShareEventHolder的持有人实例){
//设置必要字段
}
else if(类别YUSERFEEDHOLDER的持有人实例){
//设置必要字段
}
}
@凌驾
public int getItemCount(){
返回this.feeds==null?0:this.feeds.size();
}
@凌驾
public int getItemViewType(int位置){
if(feeds.get(position)==null)
返回视图\类型\加载;
else if(feeds.get(position.getResponse().getEvent()!=null)
返回视图\类型\共享\事件;
返回视图\类型\用户\提要;
}
public void setOnLoadMoreListener(OnLoadMoreListener侦听器){
this.onLoadMoreListener=监听器;
}

尝试在布局中不使用NestedScrollView的情况下使用RecyclerView,看看这个答案

找到解决方案了吗?欢迎使用堆栈溢出!不只是添加链接,而是从另一个答案中添加一些相关代码。
    public FeedsDashboardAdapter(Context context, DashboardFragment fragment, ArrayList<Edge<Activity>> feeds, RecyclerView recyclerView,
                                     NestedScrollView mainDashboardLayout){
            this.feeds = feeds;
            this.context = context;
            this.fragment = fragment;
            this.mainDashboardLayout = mainDashboardLayout;
            this.linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
            this.client = new RestClient().getApiService();
            SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
            user = new Gson().fromJson(sharedPreferences.getString("user", null), User.class );
            mainDashboardLayout.setOnScrollChangeListener(new EndlessParentScrollListener(linearLayoutManager) {
                @Override
                public void onLoadMore(int page, int totalItemsCount) {
                    Log.d(TAG, "page " + page + " totalItemsCount " + totalItemsCount);
                    if (onLoadMoreListener != null) {
                        onLoadMoreListener.onLoadMore();
                    }
                }
            });
        }
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            if (viewType == VIEW_TYPE_USER_FEEDS) {
                View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_user_feed, parent, false);
                return new CategoryUserFeedHolder(layoutView, context);
            } else if(viewType == VIEW_TYPE_SHARE_EVENT) {
                View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_feed_shared_event, parent, false);
                return new CategoryShareEventHolder(layoutView);
            }  else if (viewType == VIEW_TYPE_LOADING) {
                View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.loading_item_layout, parent, false);
                return new LoadingViewHolder(layoutView);
            }
            return null;
        }
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    if (holder instanceof CategoryShareEventHolder) {
    //set necessary field
    }
    else if(holder instanceof CategoryUserFeedHolder){
    //set necessary field
    }
}
    @Override
    public int getItemCount() {
        return this.feeds ==null ? 0 : this.feeds.size();
    }

    @Override
    public int getItemViewType(int position) {
        if (feeds.get(position) == null)
            return VIEW_TYPE_LOADING;
        else if (feeds.get(position).getResponse().getEvent() != null)
            return VIEW_TYPE_SHARE_EVENT;
        return VIEW_TYPE_USER_FEEDS;
    }

    public void setOnLoadMoreListener(OnLoadMoreListener listener){
        this.onLoadMoreListener = listener;
    }