From a3768c7d7412b3ddc9815a7fd3b6b124b2e00885 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Thu, 14 Jun 2018 11:34:10 -0700 Subject: [PATCH] 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 --- .../securesms/search/SearchFragment.java | 10 ----- .../util/StickyHeaderDecoration.java | 44 +++++++++---------- 2 files changed, 20 insertions(+), 34 deletions(-) diff --git a/src/org/thoughtcrime/securesms/search/SearchFragment.java b/src/org/thoughtcrime/securesms/search/SearchFragment.java index ad59cc7317..1ed0ae75f4 100644 --- a/src/org/thoughtcrime/securesms/search/SearchFragment.java +++ b/src/org/thoughtcrime/securesms/search/SearchFragment.java @@ -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 public void onConversationClicked(@NonNull ThreadRecord threadRecord) { ConversationListActivity conversationList = (ConversationListActivity) getActivity(); diff --git a/src/org/thoughtcrime/securesms/util/StickyHeaderDecoration.java b/src/org/thoughtcrime/securesms/util/StickyHeaderDecoration.java index 920aee7bd7..e0540b9d53 100644 --- a/src/org/thoughtcrime/securesms/util/StickyHeaderDecoration.java +++ b/src/org/thoughtcrime/securesms/util/StickyHeaderDecoration.java @@ -76,30 +76,30 @@ public class StickyHeaderDecoration extends RecyclerView.ItemDecoration { protected ViewHolder getHeader(RecyclerView parent, StickyHeaderAdapter adapter, int position) { final long key = adapter.getHeaderId(position); - if (headerCache.containsKey(key)) { - return headerCache.get(key); - } else { - final ViewHolder holder = adapter.onCreateHeaderViewHolder(parent); - final View header = holder.itemView; + ViewHolder headerHolder = headerCache.get(key); + if (headerHolder == null) { + headerHolder = adapter.onCreateHeaderViewHolder(parent); //noinspection unchecked - adapter.onBindHeaderViewHolder(holder, position); + adapter.onBindHeaderViewHolder(headerHolder, position); - int widthSpec = View.MeasureSpec.makeMeasureSpec(parent.getWidth(), View.MeasureSpec.EXACTLY); - int heightSpec = View.MeasureSpec.makeMeasureSpec(parent.getHeight(), View.MeasureSpec.UNSPECIFIED); - - int childWidth = ViewGroup.getChildMeasureSpec(widthSpec, - parent.getPaddingLeft() + parent.getPaddingRight(), header.getLayoutParams().width); - int childHeight = ViewGroup.getChildMeasureSpec(heightSpec, - parent.getPaddingTop() + parent.getPaddingBottom(), header.getLayoutParams().height); - - header.measure(childWidth, childHeight); - header.layout(0, 0, header.getMeasuredWidth(), header.getMeasuredHeight()); - - headerCache.put(key, holder); - - return holder; + headerCache.put(key, headerHolder); } + + final View header = headerHolder.itemView; + + int widthSpec = View.MeasureSpec.makeMeasureSpec(parent.getWidth(), View.MeasureSpec.EXACTLY); + int heightSpec = View.MeasureSpec.makeMeasureSpec(parent.getHeight(), View.MeasureSpec.UNSPECIFIED); + + int childWidth = ViewGroup.getChildMeasureSpec(widthSpec, + parent.getPaddingLeft() + parent.getPaddingRight(), header.getLayoutParams().width); + int childHeight = ViewGroup.getChildMeasureSpec(heightSpec, + parent.getPaddingTop() + parent.getPaddingBottom(), header.getLayoutParams().height); + + header.measure(childWidth, childHeight); + header.layout(0, 0, header.getMeasuredWidth(), header.getMeasuredHeight()); + + return headerHolder; } /** @@ -180,10 +180,6 @@ public class StickyHeaderDecoration extends RecyclerView.ItemDecoration { ((LinearLayoutManager)parent.getLayoutManager()).getReverseLayout(); } - public void invalidateLayouts() { - headerCache.clear(); - } - /** * The adapter to assist the {@link StickyHeaderDecoration} in creating and binding the header views. *