Reduce the number of times that dataset changed is triggerd in DashboardAdapter

1. Save the suggestion list and the category list into the instance
state so that it will be available on warm start, and avoid the need
to reload the data.
2. Add the condition list to the constructor parameters for
DashboardAdapter, so that it does not need to setConditions()
separately which will trigger notifyDataSetChanged()

Bug: 30055644
Change-Id: Ia04fa3a25b13d2dacf6baf5f412d662a595fb6dd
This commit is contained in:
Doris Ling
2016-07-11 18:09:15 -07:00
parent 8dc1a7340b
commit b76de265a2
2 changed files with 34 additions and 8 deletions

View File

@@ -20,6 +20,7 @@ import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import android.os.Bundle;
import android.support.v7.widget.PopupMenu;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
@@ -45,10 +46,13 @@ import com.android.settingslib.drawer.Tile;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.DashboardItemHolder>
implements View.OnClickListener {
public static final String TAG = "DashboardAdapter";
private static final String STATE_SUGGESTION_LIST = "suggestion_list";
private static final String STATE_CATEGORY_LIST = "category_list";
private static final int NS_SPACER = 0;
private static final int NS_SUGGESTION = 1000;
private static final int NS_ITEMS = 2000;
@@ -80,13 +84,20 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
private Condition mExpandedCondition = null;
private SuggestionParser mSuggestionParser;
public DashboardAdapter(Context context, SuggestionParser parser) {
public DashboardAdapter(Context context, SuggestionParser parser, Bundle savedInstanceState,
List<Condition> conditions) {
mContext = context;
mCache = new IconCache(context);
mSuggestionParser = parser;
mConditions = conditions;
setHasStableIds(true);
setShowingAll(true);
if (savedInstanceState != null) {
mSuggestions = savedInstanceState.getParcelableArrayList(STATE_SUGGESTION_LIST);
mCategories = savedInstanceState.getParcelableArrayList(STATE_CATEGORY_LIST);
}
}
public List<Tile> getSuggestions() {
@@ -94,9 +105,11 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
}
public void setSuggestions(List<Tile> suggestions) {
if (!Objects.equals(mSuggestions, suggestions)) {
mSuggestions = suggestions;
recountItems();
}
}
public Tile getTile(ComponentName component) {
for (int i = 0; i < mCategories.size(); i++) {
@@ -111,6 +124,9 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
}
public void setCategories(List<DashboardCategory> categories) {
if (Objects.equals(mCategories, categories)) {
return;
}
mCategories = categories;
// TODO: Better place for tinting?
@@ -133,9 +149,11 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
}
public void setConditions(List<Condition> conditions) {
if (!Objects.equals(mConditions, conditions)) {
mConditions = conditions;
recountItems();
}
}
public boolean isShowingAll() {
return mIsShowingAll;
@@ -422,6 +440,12 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
return packageName;
}
void onSaveInstanceState(Bundle outState) {
outState.putParcelableArrayList(STATE_SUGGESTION_LIST, new ArrayList<Tile>(mSuggestions));
outState.putParcelableArrayList(STATE_CATEGORY_LIST,
new ArrayList<DashboardCategory>(mCategories));
}
private static class IconCache {
private final Context mContext;

View File

@@ -165,6 +165,9 @@ public class DashboardSummary extends InstrumentedFragment
super.onSaveInstanceState(outState);
if (mLayoutManager == null) return;
outState.putInt(EXTRA_SCROLL_POSITION, mLayoutManager.findFirstVisibleItemPosition());
if (mAdapter != null) {
mAdapter.onSaveInstanceState(outState);
}
}
@Override
@@ -181,14 +184,13 @@ public class DashboardSummary extends InstrumentedFragment
mDashboard.setHasFixedSize(true);
mDashboard.setListener(this);
mDashboard.addItemDecoration(new DashboardDecorator(getContext()));
mAdapter = new DashboardAdapter(getContext(), mSuggestionParser);
mAdapter.setConditions(mConditionManager.getConditions());
mAdapter = new DashboardAdapter(getContext(), mSuggestionParser, bundle,
mConditionManager.getConditions());
mDashboard.setAdapter(mAdapter);
mSummaryLoader.setAdapter(mAdapter);
ConditionAdapterUtils.addDismiss(mDashboard);
if (DEBUG_TIMING) Log.d(TAG, "onViewCreated took "
+ (System.currentTimeMillis() - startTime) + " ms");
rebuildUI();
}