[英]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.