简体   繁体   English

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

[英]recyclerview scroll to top after notifyDataSetChanged()

I have very strange problem and I tried to resolve it about 2 days. 我有一个非常奇怪的问题,我试着解决它约2天。 I have a RecyclerView which nested in the NestedScrollView . 我有一个RecyclerView其嵌套在NestedScrollView I create EndlessScrollListener for my NestedScrollView and it load more data correctly, but when I call notifyDataSetChanged() or notifyItemRangeChanged() my list scroll to top to the second item or another. 我为我的NestedScrollView创建了EndlessScrollListener并且它正确加载了更多数据,但是当我调用notifyDataSetChanged()notifyItemRangeChanged()我的列表滚动到第二个项目的顶部。 Also when I want an update all items in my SwipeRefreshLayout it maybe mixed(for example the image from fourth item maybe set in first item and etc). 此外,当我想要更新我的SwipeRefreshLayout所有项目时,它可能会混合(例如,第四项中的图像可能在第一项中设置等)。 This happens only when I want to update items, when I open my app first time everything is ok. 只有当我想要更新项目时才会发生这种情况,当我第一次打开我的应用程序时一切正常。 I have no idea why it happens, please help me. 我不知道为什么会这样,请帮帮我。 Thanks in advance. 提前致谢。 My code It's my function for initialize the adapter 我的代码这是我初始化适配器的功能

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);
}

After get data from server I update my adapter from the main UI 从服务器获取数据后,我从主UI更新我的适配器

getActivity().runOnUiThread(new Runnable() {
       public void run() {
           feedsArray.addAll(feedMobile.getEdges());
           feedsDashboardAdapter.notifyDataSetChanged();
}});

When I want to update my all items 当我想更新我的所有项目时

private SwipeRefreshLayout.OnRefreshListener refreshListener = new SwipeRefreshLayout.OnRefreshListener() {
    @Override
    public void onRefresh() {
        loadAfterCursorFeed = "";
        feedsArray.clear();
        getUserFeeds(user.getAccessToken(), user.getClientId(), loadAfterCursorFeed);
    }
};

loadAfterCursorFeed it's like an id for the next page of a data. loadAfterCursorFeed它就像是下一页数据的id。 And finally my adapter 最后我的适配器

    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;
    }

尝试在布局中使用RecyclerView而不使用NestedScrollView,看看这个答案https://stackoverflow.com/a/31818632/6926324

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM