Fix StickyHeader measuring.

It didn't re-measure when pulling an item from the cache, screwing stuff
up after a phone rotation. Had a workaround for it for specific screens,
but this fixes the problem at the source.

Fixes #8583
This commit is contained in:
Greyson Parrelli 2018-06-14 11:34:10 -07:00
parent c9a0a66f18
commit a3768c7d74
2 changed files with 20 additions and 34 deletions

View File

@ -121,16 +121,6 @@ public class SearchFragment extends Fragment implements SearchListAdapter.EventL
}); });
} }
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (listDecoration != null) {
listDecoration.invalidateLayouts();
}
}
@Override @Override
public void onConversationClicked(@NonNull ThreadRecord threadRecord) { public void onConversationClicked(@NonNull ThreadRecord threadRecord) {
ConversationListActivity conversationList = (ConversationListActivity) getActivity(); ConversationListActivity conversationList = (ConversationListActivity) getActivity();

View File

@ -76,14 +76,17 @@ public class StickyHeaderDecoration extends RecyclerView.ItemDecoration {
protected ViewHolder getHeader(RecyclerView parent, StickyHeaderAdapter adapter, int position) { protected ViewHolder getHeader(RecyclerView parent, StickyHeaderAdapter adapter, int position) {
final long key = adapter.getHeaderId(position); final long key = adapter.getHeaderId(position);
if (headerCache.containsKey(key)) { ViewHolder headerHolder = headerCache.get(key);
return headerCache.get(key); if (headerHolder == null) {
} else { headerHolder = adapter.onCreateHeaderViewHolder(parent);
final ViewHolder holder = adapter.onCreateHeaderViewHolder(parent);
final View header = holder.itemView;
//noinspection unchecked //noinspection unchecked
adapter.onBindHeaderViewHolder(holder, position); adapter.onBindHeaderViewHolder(headerHolder, position);
headerCache.put(key, headerHolder);
}
final View header = headerHolder.itemView;
int widthSpec = View.MeasureSpec.makeMeasureSpec(parent.getWidth(), View.MeasureSpec.EXACTLY); int widthSpec = View.MeasureSpec.makeMeasureSpec(parent.getWidth(), View.MeasureSpec.EXACTLY);
int heightSpec = View.MeasureSpec.makeMeasureSpec(parent.getHeight(), View.MeasureSpec.UNSPECIFIED); int heightSpec = View.MeasureSpec.makeMeasureSpec(parent.getHeight(), View.MeasureSpec.UNSPECIFIED);
@ -96,10 +99,7 @@ public class StickyHeaderDecoration extends RecyclerView.ItemDecoration {
header.measure(childWidth, childHeight); header.measure(childWidth, childHeight);
header.layout(0, 0, header.getMeasuredWidth(), header.getMeasuredHeight()); header.layout(0, 0, header.getMeasuredWidth(), header.getMeasuredHeight());
headerCache.put(key, holder); return headerHolder;
return holder;
}
} }
/** /**
@ -180,10 +180,6 @@ public class StickyHeaderDecoration extends RecyclerView.ItemDecoration {
((LinearLayoutManager)parent.getLayoutManager()).getReverseLayout(); ((LinearLayoutManager)parent.getLayoutManager()).getReverseLayout();
} }
public void invalidateLayouts() {
headerCache.clear();
}
/** /**
* The adapter to assist the {@link StickyHeaderDecoration} in creating and binding the header views. * The adapter to assist the {@link StickyHeaderDecoration} in creating and binding the header views.
* *