Nav drawer folder selection styling

This commit is contained in:
str4d
2015-01-06 10:39:27 +00:00
parent 51c89267f4
commit 0552c61650
6 changed files with 61 additions and 22 deletions

View File

@@ -63,7 +63,6 @@ public class EmailListActivity extends ActionBarActivity implements
private DrawerLayout mDrawerLayout;
private RelativeLayout mDrawerOuter;
private FolderListAdapter mFolderAdapter;
private String mCurFolder;
private ImageView mNetworkStatusIcon;
private TextView mNetworkStatusText;
private ActionBarDrawerToggle mDrawerToggle;
@@ -161,10 +160,8 @@ public class EmailListActivity extends ActionBarActivity implements
EmailListFragment f = EmailListFragment.newInstance("inbox");
getSupportFragmentManager().beginTransaction()
.add(R.id.list_fragment, f).commit();
//mFolderList.setItemChecked(0, true);
mCurFolder = "";
} else {
mCurFolder = savedInstanceState.getString(ACTIVE_FOLDER);
mFolderAdapter.setSelected(savedInstanceState.getInt(ACTIVE_FOLDER));
}
// Set up fixed actions
@@ -222,7 +219,7 @@ public class EmailListActivity extends ActionBarActivity implements
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(ACTIVE_FOLDER, mCurFolder);
outState.putInt(ACTIVE_FOLDER, mFolderAdapter.getSelected());
}
@Override
@@ -361,17 +358,14 @@ public class EmailListActivity extends ActionBarActivity implements
// FolderListAdapter.OnFolderSelectedListener
public void onDrawerFolderSelected(EmailFolder folder) {
if (!folder.getName().equals(mCurFolder)) {
public void onDrawerFolderSelected(EmailFolder folder, boolean alreadySelected) {
if (!alreadySelected) {
// Create the new fragment
EmailListFragment f = EmailListFragment.newInstance(folder.getName());
// Insert the fragment
getSupportFragmentManager().beginTransaction()
.replace(R.id.list_fragment, f).commit();
// Save the current position
mCurFolder = folder.getName();
}
// Close the drawer
mDrawerLayout.closeDrawer(mDrawerOuter);

View File

@@ -1,6 +1,8 @@
package i2p.bote.android;
import android.content.Context;
import android.content.res.ColorStateList;
import android.os.Build;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
@@ -18,6 +20,7 @@ import i2p.bote.folder.FolderListener;
public class FolderListAdapter extends RecyclerView.Adapter<FolderListAdapter.ViewHolder> {
private Context mCtx;
private List<EmailFolder> mFolders;
private int mSelectedFolder;
private OnFolderSelectedListener mListener;
// Provide a reference to the views for each data item
@@ -35,11 +38,20 @@ public class FolderListAdapter extends RecyclerView.Adapter<FolderListAdapter.Vi
}
public static interface OnFolderSelectedListener {
public void onDrawerFolderSelected(EmailFolder folder);
/**
* Called when a folder has been selected from the navigation drawer.
*
* @param folder
* The EmailFolder that has just been selected.
* @param alreadySelected
* Is the selected folder already selected?
*/
public void onDrawerFolderSelected(EmailFolder folder, boolean alreadySelected);
}
public FolderListAdapter(Context ctx, OnFolderSelectedListener listener) {
mCtx = ctx;
mSelectedFolder = -1;
mListener = listener;
}
@@ -55,9 +67,26 @@ public class FolderListAdapter extends RecyclerView.Adapter<FolderListAdapter.Vi
for (EmailFolder folder : folders) {
folder.addFolderListener(folderListener);
}
if (mSelectedFolder < 0)
mSelectedFolder = 0;
notifyDataSetChanged();
}
public void setSelected(int position) {
if (position != mSelectedFolder) {
int oldSelected = mSelectedFolder;
mSelectedFolder = position;
notifyItemChanged(oldSelected);
notifyItemChanged(mSelectedFolder);
}
}
public int getSelected() {
return mSelectedFolder;
}
// Create new views (invoked by the layout manager)
@Override
public FolderListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
@@ -69,7 +98,7 @@ public class FolderListAdapter extends RecyclerView.Adapter<FolderListAdapter.Vi
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
public void onBindViewHolder(ViewHolder holder, final int position) {
final EmailFolder folder = mFolders.get(position);
holder.mIcon.setImageDrawable(BoteHelper.getFolderIcon(mCtx, folder));
@@ -80,12 +109,24 @@ public class FolderListAdapter extends RecyclerView.Adapter<FolderListAdapter.Vi
holder.mName.setText(BoteHelper.getFolderDisplayName(mCtx, folder));
}
holder.itemView.setSelected(position == mSelectedFolder);
holder.mName.setTextAppearance(mCtx, position == mSelectedFolder ?
R.style.TextAppearance_AppCompat_NavDrawer_Selected :
R.style.TextAppearance_AppCompat_NavDrawer);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mListener.onDrawerFolderSelected(folder);
setSelected(position);
mListener.onDrawerFolderSelected(folder, position == mSelectedFolder);
}
});
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
holder.mIcon.setImageTintList(position == mSelectedFolder ?
new ColorStateList(new int[][]{{}},
new int[]{mCtx.getResources().getColor(R.color.accent_dark)}) : null);
}
// Return the size of the dataset (invoked by the layout manager)

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/translucent_blue" android:state_activated="true" />
<item android:drawable="@color/translucent_blue" android:state_checked="true" />
<item android:drawable="@color/translucent_blue" android:state_pressed="true" />
<item android:drawable="@color/translucent_blue" android:state_selected="true" />
<item android:drawable="@color/listitem_selected" android:state_activated="true" />
<item android:drawable="@color/listitem_selected" android:state_checked="true" />
<item android:drawable="@color/listitem_selected" android:state_pressed="true" />
<item android:drawable="@color/listitem_selected" android:state_selected="true" />
<item android:drawable="@android:color/transparent" />
</selector>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/translucent_blue" android:state_activated="true" />
<item android:drawable="@color/translucent_blue" android:state_checked="true" />
<item android:drawable="@color/listitem_selected" android:state_activated="true" />
<item android:drawable="@color/listitem_selected" android:state_checked="true" />
<item android:drawable="@android:color/transparent" />
</selector>

View File

@@ -6,10 +6,8 @@
<color name="accent">#ffab40</color><!-- Orange A200 -->
<color name="accent_dark">#ff9100</color><!-- Orange A400 -->
<!-- A translucent holo blue -->
<color name="translucent_blue">#9033B5E5</color>
<color name="listitem_selected">#e0e0e0</color>
<color name="uva_color">#c31756</color>
<color name="default_color">#111</color>
<color name="error_color">#f00</color>
<color name="green">#4caf50</color>

View File

@@ -29,6 +29,12 @@
<item name="android:textSize">@dimen/text_size_primary</item>
</style>
<style name="TextAppearance.AppCompat.NavDrawer" parent="TextAppearance.AppCompat.Primary"/>
<style name="TextAppearance.AppCompat.NavDrawer.Selected" parent="TextAppearance.AppCompat.NavDrawer">
<item name="android:textColor">@color/accent_dark</item>
</style>
<style name="TextAppearance.AppCompat.Subject" parent="TextAppearance.AppCompat.Primary">
<item name="android:textSize">@dimen/text_size_subject</item>
</style>