Popover list selection menu

pull/14/head
Sam Bosley 13 years ago
parent 75ad7c4e78
commit c014cccc2c

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 B

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="center_vertical">
<TextView
android:id="@+id/lists_nav"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/TextAppearance.GEN_EditLabel"
android:textSize="20dip"/>
</LinearLayout>

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ListView
android:id="@android:id/list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/gdi_arrow_up"
android:gravity="center"
android:background="@drawable/list_popover_bg"
android:fadingEdgeLength="0dp"/>
<ImageView
android:id="@+id/gdi_arrow_up"
android:layout_width="27dip"
android:layout_height="27dip"
android:scaleType="fitCenter"
android:layout_marginBottom="-8dip"
android:src="@drawable/list_arrow_up" />
<ImageView
android:id="@+id/gdi_arrow_down"
android:layout_width="27dip"
android:layout_height="27dip"
android:scaleType="fitCenter"
android:layout_marginBottom="-8dip"
android:layout_below="@android:id/list"
android:src="@drawable/list_arrow_down" />
</RelativeLayout>

@ -6,6 +6,7 @@ import android.os.Bundle;
import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction; import android.support.v4.app.FragmentTransaction;
import android.view.ViewGroup;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
@ -85,8 +86,8 @@ public class AstridWrapperActivity extends FragmentActivity
* Handles items being clicked from the filterlist-fragment. Return true if item is handled. * Handles items being clicked from the filterlist-fragment. Return true if item is handled.
*/ */
public boolean onFilterItemClicked(FilterListItem item) { public boolean onFilterItemClicked(FilterListItem item) {
if (this instanceof TaskListWrapperActivity) { if (this instanceof TaskListWrapperActivity && (item instanceof Filter) ) {
((TaskListWrapperActivity) this).setSelectedItem(item); ((TaskListWrapperActivity) this).setSelectedItem((Filter) item);
} }
if (!mMultipleFragments || (item instanceof SearchFilter)) { if (!mMultipleFragments || (item instanceof SearchFilter)) {
if(item instanceof Filter) { if(item instanceof Filter) {
@ -168,13 +169,20 @@ public class AstridWrapperActivity extends FragmentActivity
protected void setupFilterlistFragment() { protected void setupFilterlistFragment() {
FragmentManager manager = getSupportFragmentManager(); FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction(); FragmentTransaction transaction = manager.beginTransaction();
FilterListActivity newFragment = new FilterListActivity(); FilterListActivity frag = getFilterListFragment();
if (findViewById(R.id.filterlist_fragment_container) != null) { if (frag == null)
transaction.replace(R.id.filterlist_fragment_container, newFragment, FilterListActivity.TAG_FILTERLIST_FRAGMENT); frag = new FilterListActivity();
ViewGroup container = (ViewGroup) findViewById(R.id.filterlist_fragment_container);
if (container != null) {
if (container.getChildCount() > 0)
transaction.replace(R.id.filterlist_fragment_container, frag, FilterListActivity.TAG_FILTERLIST_FRAGMENT);
else
transaction.add(R.id.filterlist_fragment_container, frag, FilterListActivity.TAG_FILTERLIST_FRAGMENT);
} else { } else {
if (getFilterListFragment() != null) if (getFilterListFragment() != null)
return; return;
transaction.add(newFragment, FilterListActivity.TAG_FILTERLIST_FRAGMENT); transaction.add(frag, FilterListActivity.TAG_FILTERLIST_FRAGMENT);
} }
transaction.commit(); transaction.commit();
} }

@ -3,20 +3,38 @@ package com.todoroo.astrid.activity;
import android.os.Bundle; import android.os.Bundle;
import android.support.v4.app.ActionBar; import android.support.v4.app.ActionBar;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.TextView;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.service.ThemeService; import com.todoroo.astrid.service.ThemeService;
import com.todoroo.astrid.ui.ListDropdownPopover;
public class TaskListWrapperActivity extends AstridWrapperActivity { public class TaskListWrapperActivity extends AstridWrapperActivity {
public static final String TOKEN_SELECTED_FILTER = "selectedFilter"; public static final String TOKEN_SELECTED_FILTER = "selectedFilter";
private int selectionToSet; private int currSelection;
private TextView lists;
private ArrayAdapter<FilterListItem> listDropdownAdapter;
private ArrayAdapter<Filter> listDropdownAdapter;
private ListDropdownPopover popover;
private final OnItemClickListener listClickListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Filter item = listDropdownAdapter.getItem(position);
currSelection = position;
onFilterItemClicked(item);
popover.dismiss();
lists.setText(item.title);
}
};
/** /**
* @see android.app.Activity#onCreate(Bundle) * @see android.app.Activity#onCreate(Bundle)
*/ */
@ -33,11 +51,24 @@ public class TaskListWrapperActivity extends AstridWrapperActivity {
setupFilterlistFragment(); setupFilterlistFragment();
ActionBar actionBar = getSupportActionBar(); ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
actionBar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); actionBar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
actionBar.setCustomView(R.layout.header_nav_views);
popover = new ListDropdownPopover(TaskListWrapperActivity.this, R.layout.list_dropdown_popover);
lists = (TextView) actionBar.getCustomView().findViewById(R.id.lists_nav);
lists.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
popover.show(v);
}
});
currSelection = 0;
if (savedInstanceState != null) { if (savedInstanceState != null) {
selectionToSet = savedInstanceState.getInt(TOKEN_SELECTED_FILTER); currSelection = savedInstanceState.getInt(TOKEN_SELECTED_FILTER);
} }
} }
@ -59,30 +90,23 @@ public class TaskListWrapperActivity extends AstridWrapperActivity {
} }
} }
public void updateDropdownNav(ArrayAdapter<FilterListItem> arrayAdapter) { public void updateDropdownNav(ArrayAdapter<Filter> arrayAdapter) {
listDropdownAdapter = arrayAdapter; listDropdownAdapter = arrayAdapter;
ActionBar actionBar = getSupportActionBar(); popover.setAdapter(listDropdownAdapter, listClickListener);
actionBar.setListNavigationCallbacks(arrayAdapter, new ActionBar.OnNavigationListener() { if (currSelection < listDropdownAdapter.getCount()) {
@Override lists.setText(listDropdownAdapter.getItem(currSelection).title);
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
onFilterItemClicked(listDropdownAdapter.getItem(itemPosition));
return true;
}
});
if (selectionToSet < listDropdownAdapter.getCount()) {
getSupportActionBar().setSelectedNavigationItem(selectionToSet);
} }
} }
@Override @Override
protected void onSaveInstanceState(Bundle icicle) { protected void onSaveInstanceState(Bundle icicle) {
icicle.putInt(TOKEN_SELECTED_FILTER, getSupportActionBar().getSelectedNavigationIndex()); icicle.putInt(TOKEN_SELECTED_FILTER, currSelection);
super.onSaveInstanceState(icicle); super.onSaveInstanceState(icicle);
} }
public void setSelectedItem(FilterListItem item) { public void setSelectedItem(Filter item) {
int position = listDropdownAdapter.getPosition(item); currSelection = listDropdownAdapter.getPosition(item);
getSupportActionBar().setSelectedNavigationItem(position); lists.setText(item.title);
} }
@Override @Override

@ -365,8 +365,8 @@ public class FilterAdapter extends BaseExpandableListAdapter {
for (Filter f : children) { for (Filter f : children) {
arrayAdapter.add(f); arrayAdapter.add(f);
} }
} else { } else if (filter instanceof Filter){
arrayAdapter.add(filter); arrayAdapter.add((Filter) filter);
} }
} }
notifyDataSetChanged(); notifyDataSetChanged();
@ -628,7 +628,7 @@ public class FilterAdapter extends BaseExpandableListAdapter {
}); });
} }
private class FilterArrayAdapter extends ArrayAdapter<FilterListItem> { private class FilterArrayAdapter extends ArrayAdapter<Filter> {
public FilterArrayAdapter(Context context) { public FilterArrayAdapter(Context context) {
super(context, 0); super(context, 0);
@ -640,6 +640,7 @@ public class FilterAdapter extends BaseExpandableListAdapter {
ViewHolder viewHolder = (ViewHolder) convertView.getTag(); ViewHolder viewHolder = (ViewHolder) convertView.getTag();
viewHolder.item = (FilterListItem) getItem(position); viewHolder.item = (FilterListItem) getItem(position);
populateView(viewHolder, false); populateView(viewHolder, false);
viewHolder.name.setTextColor(Color.WHITE);
return convertView; return convertView;
} }

@ -0,0 +1,61 @@
package com.todoroo.astrid.ui;
import greendroid.widget.QuickAction;
import greendroid.widget.QuickActionWidget;
import java.util.List;
import android.R;
import android.content.Context;
import android.graphics.Rect;
import android.view.View;
import android.view.View.MeasureSpec;
import android.view.ViewGroup;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.FrameLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
public class ListDropdownPopover extends QuickActionWidget {
private final ListView listView;
public ListDropdownPopover(Context context, int layout) {
super(context);
setContentView(layout);
listView = (ListView) getContentView().findViewById(R.id.list);
setFocusable(true);
setTouchable(true);
}
public void setAdapter(ListAdapter adapter, OnItemClickListener listener) {
listView.setAdapter(adapter);
listView.setOnItemClickListener(listener);
}
@Override
protected void populateQuickActions(List<QuickAction> quickActions) {
// Do nothing
}
@Override
protected void onMeasureAndLayout(Rect anchorRect, View contentView) {
contentView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
contentView.measure(MeasureSpec.makeMeasureSpec(getScreenWidth(), MeasureSpec.EXACTLY),
ViewGroup.LayoutParams.WRAP_CONTENT);
int rootHeight = contentView.getMeasuredHeight();
int offsetY = getArrowOffsetY();
int dyTop = anchorRect.top;
int dyBottom = getScreenHeight() - anchorRect.bottom;
boolean onTop = (dyTop > dyBottom);
int popupY = (onTop) ? anchorRect.top - rootHeight + offsetY : anchorRect.bottom - offsetY;
setWidgetSpecs(popupY, onTop);
}
}
Loading…
Cancel
Save