Bug 1339520 - Don't refresh topsites pages, only modify if needed r=sebastian

If we clear and recreate pages every time the cursor changes, we'll (A) lose
the current page position and (B) create a new RecyclerView per page, resulting
in flickering. We also need to make sure positioning is correctly handled (i.e. pages
never move, they only get added or removed).

We also switch to an ArrayList: the number of pages will be fixed for most users,
and searching an ArrayList could potentially be slightly faster than with the LinkedList.
There's little advantage to a LinkedList here.

MozReview-Commit-ID: 6NIfc2otQMV

--HG--
extra : rebase_source : 86b51be92c18e791f8049b5c90441370c6bace9a
This commit is contained in:
Andrzej Hunt 2017-02-16 18:39:08 -08:00
Родитель be415107d3
Коммит 9915444198
1 изменённых файлов: 16 добавлений и 7 удалений

Просмотреть файл

@ -15,7 +15,8 @@ import org.mozilla.gecko.R;
import org.mozilla.gecko.home.HomePager;
import org.mozilla.gecko.widget.RecyclerViewClickSupport;
import java.util.LinkedList;
import java.util.ArrayList;
import java.util.List;
/**
* The primary / top-level TopSites adapter: it handles the ViewPager, and also handles
@ -29,7 +30,7 @@ public class TopSitesPagerAdapter extends PagerAdapter {
private int tilesWidth;
private int tilesHeight;
private LinkedList<TopSitesPage> pages = new LinkedList<>();
private final List<TopSitesPage> pages;
private final Context context;
private final HomePager.OnUrlOpenListener onUrlOpenListener;
@ -40,6 +41,8 @@ public class TopSitesPagerAdapter extends PagerAdapter {
public TopSitesPagerAdapter(Context context,
HomePager.OnUrlOpenListener onUrlOpenListener,
HomePager.OnUrlOpenInBackgroundListener onUrlOpenInBackgroundListener) {
pages = new ArrayList<>(PAGES);
this.context = context;
this.onUrlOpenListener = onUrlOpenListener;
this.onUrlOpenInBackgroundListener = onUrlOpenInBackgroundListener;
@ -72,7 +75,12 @@ public class TopSitesPagerAdapter extends PagerAdapter {
@Override
public int getItemPosition(Object object) {
return PagerAdapter.POSITION_NONE;
if (pages.contains(object)) {
// Pages don't get rearranged, so if it exists it still has its original position
return PagerAdapter.POSITION_UNCHANGED;
} else {
return PagerAdapter.POSITION_NONE;
}
}
@Override
@ -88,8 +96,9 @@ public class TopSitesPagerAdapter extends PagerAdapter {
count = 0;
}
pages.clear();
final int pageDelta = count;
// Try to only add/remove pages if really needed: this minimises the amount of UI work that
// happens when e.g. only one topsite has moved or has been added.
final int pageDelta = count - pages.size();
if (pageDelta > 0) {
final LayoutInflater inflater = LayoutInflater.from(context);
@ -106,12 +115,12 @@ public class TopSitesPagerAdapter extends PagerAdapter {
}
} else if (pageDelta < 0) {
for (int i = 0; i > pageDelta; i--) {
final TopSitesPage page = pages.getLast();
final TopSitesPage page = pages.get(pages.size() - 1);
// Ensure the page doesn't use the old/invalid cursor anymore
page.getAdapter().swapCursor(null, 0);
pages.removeLast();
pages.remove(pages.size() - 1);
}
} else {
// do nothing: we will be updating all the pages below