From 67c33ad8a233069bfe2c84cdd9f2e424ff9c1ff7 Mon Sep 17 00:00:00 2001 From: seven332 Date: Fri, 29 May 2015 11:33:15 +0800 Subject: [PATCH] Improve Preference --- .../java/com/hippo/scene/SimpleDialog.java | 29 ++++++++++++-- .../scene/preference/DialogPreference.java | 40 ++++++++++++++++--- .../hippo/scene/preference/Preference.java | 29 +++++++++++++- .../scene/preference/PreferenceBase.java | 2 +- .../scene/preference/PreferenceCategory.java | 2 +- .../scene/preference/PreferenceScene.java | 19 ++++++++- 6 files changed, 108 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/hippo/scene/SimpleDialog.java b/app/src/main/java/com/hippo/scene/SimpleDialog.java index 91ddb78e4..e80ebe6b7 100644 --- a/app/src/main/java/com/hippo/scene/SimpleDialog.java +++ b/app/src/main/java/com/hippo/scene/SimpleDialog.java @@ -63,6 +63,8 @@ public class SimpleDialog extends SceneDialog implements View.OnClickListener, private View mSpacePositiveNegative; private TextView mPositiveButton; + private boolean mCancel = true; + private int mFitPaddingBottom; private void setBuilder(@NonNull Builder builder) { @@ -110,10 +112,19 @@ public class SimpleDialog extends SceneDialog implements View.OnClickListener, mBuilder.mContext = getStageActivity(); } + @Override + protected void onDestroy() { + super.onDestroy(); + + OnCloseListener listener = mBuilder.mOnCloseListener; + if (listener != null) { + listener.onClose(this, mCancel); + } + } + private void bindDialog() { ListView listView = mListView; - if (mBuilder.mTitle == null && mBuilder.mMessage == null && mBuilder.mCustomViewResId == 0) { ViewUtils.setVisibility(mBody, View.GONE); } else { @@ -243,11 +254,17 @@ public class SimpleDialog extends SceneDialog implements View.OnClickListener, } } + public int getSelectItemPosition() { + // TODO check mListView isShown + return mListView.getSelectedItemPosition(); + } + @Override public void onClick(View v) { if (v == mPositiveButton) { if (mBuilder.mOnButtonClickListener == null || mBuilder.mOnButtonClickListener.onClick(this, POSITIVE)) { + mCancel = false; finish(); } } else if (v == mNegativeButton) { @@ -263,6 +280,7 @@ public class SimpleDialog extends SceneDialog implements View.OnClickListener, if (parent == mListView) { OnClickListener listener = mBuilder.mOnListItemClickListener; if (listener == null || listener.onClick(this, position)) { + mCancel = false; finish(); } } @@ -299,6 +317,7 @@ public class SimpleDialog extends SceneDialog implements View.OnClickListener, private OnClickListener mOnButtonClickListener; private boolean mCancelable = true; + private OnCloseListener mOnCloseListener; private int mStartX; private int mStartY; @@ -415,6 +434,11 @@ public class SimpleDialog extends SceneDialog implements View.OnClickListener, return this; } + public Builder setOnCloseListener(OnCloseListener listener) { + mOnCloseListener = listener; + return this; + } + public Builder setStartPoint(int startX, int startY) { mStartX = startX; mStartY = startY; @@ -447,8 +471,7 @@ public class SimpleDialog extends SceneDialog implements View.OnClickListener, boolean onClick(SimpleDialog dialog, int which); } - // TODO public interface OnCloseListener { - void onClose(); + void onClose(SimpleDialog dialog, boolean cancel); } } diff --git a/app/src/main/java/com/hippo/scene/preference/DialogPreference.java b/app/src/main/java/com/hippo/scene/preference/DialogPreference.java index 31f359b69..f4804f008 100644 --- a/app/src/main/java/com/hippo/scene/preference/DialogPreference.java +++ b/app/src/main/java/com/hippo/scene/preference/DialogPreference.java @@ -2,22 +2,52 @@ package com.hippo.scene.preference; import android.support.v7.widget.RecyclerView; +import com.hippo.ehviewer.util.Config; import com.hippo.scene.SimpleDialog; +// TODO show current value as summary public class DialogPreference extends Preference { + private CharSequence[] mKeys; + private int[] mValues; + + private int mDefaultValue; + public DialogPreference(String key, String title, String summary) { super(key, title, summary); } + public void setKeys(CharSequence[] keys) { + mKeys = keys; + } + + public void setValues(int[] values) { + mValues = values; + } + + public void setDefaultValue(int defaultValue) { + mDefaultValue = defaultValue; + } + @Override public boolean onClick(RecyclerView.ViewHolder viewHolder, int x, int y) { if (!super.onClick(viewHolder, x, y)) { - SimpleDialog.Builder builder = new SimpleDialog.Builder(viewHolder.itemView.getContext()); - builder.setTitle("Title"); - builder.setSingleChoiceItems(new CharSequence[]{"横向", "竖向", "斜向"}, 0, null); - builder.setStartPoint(x, y); - builder.show(); + new SimpleDialog.Builder(viewHolder.itemView.getContext()) + .setTitle(getTitle()) + .setSingleChoiceItems(mKeys, Config.getInt(getKey(), mDefaultValue), null) + .setStartPoint(x, y) + .setOnCloseListener(new SimpleDialog.OnCloseListener() { + @Override + public void onClose(SimpleDialog dialog, boolean cancel) { + if (!cancel) { + int position = dialog.getSelectItemPosition(); + if (position >= 0 && position < mValues.length) { + Config.putInt(getKey(), mValues[position]); + // TODO Update summary + } + } + } + }).show(); } return true; } diff --git a/app/src/main/java/com/hippo/scene/preference/Preference.java b/app/src/main/java/com/hippo/scene/preference/Preference.java index 10c5b0bec..710e5e39c 100644 --- a/app/src/main/java/com/hippo/scene/preference/Preference.java +++ b/app/src/main/java/com/hippo/scene/preference/Preference.java @@ -25,11 +25,14 @@ import com.hippo.ehviewer.R; public class Preference extends PreferenceBase { + private int mPosition; + private String mKey; private String mTitle; private String mSummary; private OnClickListener mOnClickListener; + private ViewHolderGetter mViewHolderGetter; public Preference(String key, String title, String summary) { mKey = key; @@ -41,6 +44,14 @@ public class Preference extends PreferenceBase { return mKey; } + public int getPosition() { + return mPosition; + } + + public void setPosition(int position) { + mPosition = position; + } + @Override int getItemViewType() { return PreferenceCenter.TYPE_PEFERENCE; @@ -51,7 +62,7 @@ public class Preference extends PreferenceBase { } @Override - void bindViewHolde(Context context, RecyclerView.ViewHolder viewHolder) { + void bindViewHolder(Context context, RecyclerView.ViewHolder viewHolder) { PreferenceHolder pvh = (PreferenceHolder) viewHolder; pvh.title.setText(mTitle); pvh.summary.setText(mSummary); @@ -95,11 +106,27 @@ public class Preference extends PreferenceBase { mTitle = title; } + public RecyclerView.ViewHolder getViewHolder() { + if (mViewHolderGetter != null) { + return mViewHolderGetter.getViewHolder(mPosition); + } else { + return null; + } + } + public void setOnClickListener(OnClickListener listener) { mOnClickListener = listener; } + public void setViewHolderGetter(ViewHolderGetter viewHolderGetter) { + mViewHolderGetter = viewHolderGetter; + } + public interface OnClickListener { boolean onClick(); } + + public interface ViewHolderGetter { + RecyclerView.ViewHolder getViewHolder(int position); + } } diff --git a/app/src/main/java/com/hippo/scene/preference/PreferenceBase.java b/app/src/main/java/com/hippo/scene/preference/PreferenceBase.java index c53af1bb8..04894f6d9 100644 --- a/app/src/main/java/com/hippo/scene/preference/PreferenceBase.java +++ b/app/src/main/java/com/hippo/scene/preference/PreferenceBase.java @@ -22,7 +22,7 @@ abstract class PreferenceBase { abstract int getItemViewType(); - abstract void bindViewHolde(Context context, RecyclerView.ViewHolder viewHolder); + abstract void bindViewHolder(Context context, RecyclerView.ViewHolder viewHolder); /** * @param viewHolder the view holder of the view diff --git a/app/src/main/java/com/hippo/scene/preference/PreferenceCategory.java b/app/src/main/java/com/hippo/scene/preference/PreferenceCategory.java index d3d76cb82..913092a53 100644 --- a/app/src/main/java/com/hippo/scene/preference/PreferenceCategory.java +++ b/app/src/main/java/com/hippo/scene/preference/PreferenceCategory.java @@ -41,7 +41,7 @@ public class PreferenceCategory extends PreferenceBase { } @Override - void bindViewHolde(Context context, RecyclerView.ViewHolder viewHolder) { + void bindViewHolder(Context context, RecyclerView.ViewHolder viewHolder) { PreferenceCategoryHolder pvh = (PreferenceCategoryHolder) viewHolder; pvh.title.setText(mTitle); } diff --git a/app/src/main/java/com/hippo/scene/preference/PreferenceScene.java b/app/src/main/java/com/hippo/scene/preference/PreferenceScene.java index 30e2c7785..6e6da16c1 100644 --- a/app/src/main/java/com/hippo/scene/preference/PreferenceScene.java +++ b/app/src/main/java/com/hippo/scene/preference/PreferenceScene.java @@ -38,6 +38,7 @@ public class PreferenceScene extends AppbarScene { private EasyRecyclerView mRecyclerView; private PreferenceAdapter mAdapter; + private PreferenceViewHolderGetter mPreferenceViewHolderGetter = new PreferenceViewHolderGetter(); private List mPreferenceSetList = new ArrayList<>(); private List mPreferenceBaseList = new ArrayList<>(); @@ -71,19 +72,25 @@ public class PreferenceScene extends AppbarScene { preferenceSetList.clear(); Collections.addAll(preferenceSetList, preferenceSets); // Update mPreferenceBasesList + int position = 0; List preferenceBaseList = mPreferenceBaseList; preferenceBaseList.clear(); for (PreferenceSet ps : preferenceSets) { PreferenceCategory pc = ps.getPreferenceCategory(); if (pc != null) { preferenceBaseList.add(pc); + position++; } int pdCount = ps.getPreferenceCount(); for (int i = 0; i < pdCount; i++) { if (i != 0) { preferenceBaseList.add(PREFERENCE_DIVIDER); + position++; } - preferenceBaseList.add(ps.getPreferenceData(i)); + Preference p = ps.getPreferenceData(i); + p.setPosition(position); + preferenceBaseList.add(p); + position++; } } mAdapter.notifyDataSetChanged(); @@ -98,7 +105,7 @@ public class PreferenceScene extends AppbarScene { @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { - mPreferenceBaseList.get(position).bindViewHolde(getStageActivity(), holder); + mPreferenceBaseList.get(position).bindViewHolder(getStageActivity(), holder); } @Override @@ -133,4 +140,12 @@ public class PreferenceScene extends AppbarScene { !(pb instanceof PreferenceDivider); } } + + private class PreferenceViewHolderGetter implements Preference.ViewHolderGetter { + + @Override + public RecyclerView.ViewHolder getViewHolder(int position) { + return mRecyclerView.findViewHolderForAdapterPosition(position); + } + } }