package preference; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.XmlRes; import android.support.wearable.view.WearableListView; import android.view.ViewGroup; import java.util.ArrayList; import java.util.List; import me.denley.wearpreferenceactivity.R; import preference.internal.ListItemLayout; import preference.internal.TitledWearActivity; import preference.internal.WearPreferenceItem; import preference.internal.WearPreferenceScreen; /** * An Activity that will show preferences items in a list. * * Users should subclass this class and call {@link #addPreferencesFromResource(int)} to populate the list of preference items. */ public abstract class WearPreferenceActivity extends TitledWearActivity { private WearableListView list; private List<WearPreferenceItem> preferences = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.preference_list); list = (WearableListView) findViewById(android.R.id.list); } /** * Inflates the preferences from the given resource and displays them on this page. * @param prefsResId The resource ID of the preferences xml file. */ protected void addPreferencesFromResource(@XmlRes int prefsResId) { addPreferencesFromResource(prefsResId, new XmlPreferenceParser()); } /** * Inflates the preferences from the given resource and displays them on this page. * @param prefsResId The resource ID of the preferences xml file. * @param parser A parser used to parse custom preference types */ protected void addPreferencesFromResource(@XmlRes int prefsResId, @NonNull XmlPreferenceParser parser) { final WearPreferenceScreen prefsRoot = parser.parse(this, prefsResId); addPreferencesFromPreferenceScreen(prefsRoot); } /** DO NOT USE - For internal use only */ protected void addPreferencesFromPreferenceScreen(WearPreferenceScreen preferenceScreen){ addPreferences(preferenceScreen.getChildren()); } private void addPreferences(List<WearPreferenceItem> newPreferences){ preferences = newPreferences; list.setAdapter(new SettingsAdapter()); list.setClickListener(new WearableListView.ClickListener() { @Override public void onClick(final WearableListView.ViewHolder viewHolder) { final WearPreferenceItem clickedItem = preferences.get(viewHolder.getPosition()); clickedItem.onPreferenceClick(WearPreferenceActivity.this); } @Override public void onTopEmptyRegionClick() {} }); } private class SettingsAdapter extends WearableListView.Adapter { @Override public WearableListView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { final ListItemLayout itemView = new ListItemLayout(WearPreferenceActivity.this); return new WearableListView.ViewHolder(itemView); } @Override public void onBindViewHolder(WearableListView.ViewHolder holder, int position) { final WearPreferenceItem preference = preferences.get(position); final ListItemLayout itemView = (ListItemLayout)holder.itemView; itemView.bindPreference(preference); itemView.onNonCenterPosition(false); } @Override public int getItemCount() { return preferences.size(); } @Override public void onViewRecycled(WearableListView.ViewHolder holder) { final ListItemLayout itemView = (ListItemLayout)holder.itemView; itemView.releaseBinding(); } } }