[英]How to prevent auto scroll in RecyclerView after notifyDataSetChanged?
[英]recyclerview scroll to top after notifyDataSetChanged()
我有一个非常奇怪的问题,我试着解决它约2天。 我有一个RecyclerView
其嵌套在NestedScrollView
。 我为我的NestedScrollView
创建了EndlessScrollListener
并且它正确加载了更多数据,但是当我调用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);
}
从服务器获取数据后,我从主UI更新我的适配器
getActivity().runOnUiThread(new Runnable() {
public void run() {
feedsArray.addAll(feedMobile.getEdges());
feedsDashboardAdapter.notifyDataSetChanged();
}});
当我想更新我的所有项目时
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;
}
尝试在布局中使用RecyclerView而不使用NestedScrollView,看看这个答案https://stackoverflow.com/a/31818632/6926324
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.