Created
March 6, 2011 15:28
-
-
Save mgroves/857356 to your computer and use it in GitHub Desktop.
MVP pattern in MonoDroid
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public interface IMainView | |
{ | |
void RefreshList(IList<string> portfolioNames); | |
void StartAddPortfolioActivity(); | |
void StartViewPortfolioActivity(long portfolioId); | |
void StartEditPortfolioActivity(int itemId); | |
void StartConfigActivity(); | |
void ExitApplication(); | |
} | |
public interface IMainPresenter | |
{ | |
void Initialize(IMainView view); | |
void RefreshPortfolioList(); | |
void AddNewPortfolio(); | |
void ViewPortfolio(int portfolioPosition); | |
void DeletePortfolio(int itemId); | |
void EditPortfolio(int itemId); | |
void GotoConfig(); | |
void ExitApplication(); | |
int GetPortfolioIdForContextMenu(string selectedPortfolioName); | |
} | |
public class MainPresenter : IMainPresenter | |
{ | |
private IPortfolioRepository _repo; | |
private IMainView _currentView; | |
private IList<Portfolio> _portfolios; | |
private IList<Portfolio> Portfolios | |
{ | |
get | |
{ | |
return _portfolios ?? (_portfolios = _repo.GetAllPortfolios()); | |
} | |
} | |
public MainPresenter(IPortfolioRepository portfolioRepository) | |
{ | |
_repo = portfolioRepository; | |
} | |
public void Initialize(IMainView view) | |
{ | |
_currentView = view; | |
RefreshPortfolioList(); | |
} | |
public void RefreshPortfolioList() | |
{ | |
var portfolioNames = Portfolios.Select(p => p.Name).ToList(); | |
_currentView.RefreshList(portfolioNames); | |
} | |
public void AddNewPortfolio() | |
{ | |
_currentView.StartAddPortfolioActivity(); | |
} | |
public void ViewPortfolio(int portfolioPosition) | |
{ | |
// why is _currentView null? | |
_currentView.StartViewPortfolioActivity(Portfolios[portfolioPosition].ID ?? -1); | |
} | |
public void DeletePortfolio(int itemId) | |
{ | |
_repo.DeletePortfolioById(itemId); | |
} | |
public void EditPortfolio(int itemId) | |
{ | |
_currentView.StartEditPortfolioActivity(itemId); | |
} | |
public void GotoConfig() | |
{ | |
_currentView.StartConfigActivity(); | |
} | |
public void ExitApplication() | |
{ | |
_currentView.ExitApplication(); | |
} | |
public int GetPortfolioIdForContextMenu(string selectedPortfolioName) | |
{ | |
var selectedPortfolio = _repo.GetPortfolioByName(selectedPortfolioName); | |
var id = (int)(selectedPortfolio.ID ?? -1); | |
return id; | |
} | |
} | |
[Activity(Label = "Stock Portfolio", MainLauncher = true, Icon = "@drawable/icon")] | |
public class MainActivity : Activity, IMainView | |
{ | |
[LazyView(Resource.Id.btnAddPortfolio)] protected Button AddPortfolioButton; | |
[LazyView(Resource.Id.portfolioList)] protected ListView PortfolioListView; | |
[IoC] IMainPresenter _presenter; | |
protected override void OnCreate(Bundle bundle) | |
{ | |
base.OnCreate(bundle); | |
SetContentView(Resource.Layout.main); | |
_presenter.Initialize(this); | |
WireUpEvents(); | |
} | |
#region IMainView implementation | |
public void RefreshList(IList<string> portfolioNames) | |
{ | |
var listAdapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1, portfolioNames); | |
PortfolioListView.Adapter = listAdapter; | |
} | |
public void ExitApplication() | |
{ | |
Finish(); | |
} | |
public void StartEditPortfolioActivity(int itemId) | |
{ | |
var intent = EditPortfolioActivity.EditIntent(this, itemId); | |
StartActivityForResult(intent, 0); | |
} | |
public void StartConfigActivity() | |
{ | |
var intent = ConfigActivity.GotoIntent(this); | |
StartActivityForResult(intent, 0); | |
} | |
public void StartViewPortfolioActivity(long portfolioId) | |
{ | |
var intent = PortfolioActivity.ViewIntent(this, portfolioId); | |
StartActivityForResult(intent, 0); | |
} | |
public void StartAddPortfolioActivity() | |
{ | |
var intent = EditPortfolioActivity.AddIntent(this); | |
StartActivityForResult(intent, 0); | |
} | |
#endregion | |
private void WireUpEvents() | |
{ | |
AddPortfolioButton.Click += addPortfolioButton_Click; | |
PortfolioListView.ItemClick += listView_ItemClick; | |
RegisterForContextMenu(PortfolioListView); | |
} | |
public override void OnCreateContextMenu(IContextMenu menu, View v, IContextMenuContextMenuInfo menuInfo) | |
{ | |
base.OnCreateContextMenu(menu, v, menuInfo); | |
var info = (AdapterView.AdapterContextMenuInfo)menuInfo; | |
var selectedPortfolioName = ((TextView)info.TargetView).Text.ToS(); | |
var id = _presenter.GetPortfolioIdForContextMenu(selectedPortfolioName); | |
menu.SetHeaderTitle("Options".ToJ()); | |
menu.Add(0, id, 1, "Rename".ToJ()); | |
menu.Add(0, id, 2, "Delete".ToJ()); | |
} | |
public override bool OnContextItemSelected(IMenuItem item) | |
{ | |
if (item.TitleFormatted.ToS() == "Rename") | |
{ | |
// Edit | |
_presenter.EditPortfolio(item.ItemId); | |
return true; | |
} | |
if (item.TitleFormatted.ToS() == "Delete") | |
{ | |
// Delete | |
_presenter.DeletePortfolio(item.ItemId); | |
_presenter.RefreshPortfolioList(); | |
return true; | |
} | |
return base.OnContextItemSelected(item); | |
} | |
public override bool OnCreateOptionsMenu(IMenu menu) | |
{ | |
var configItem = menu.Add(0, 1, 1, "Config".ToJ()); | |
configItem.SetIcon(Android.Resource.Drawable.IcMenuPreferences); | |
var exitItem = menu.Add(0, 1, 1, "Exit".ToJ()); | |
exitItem.SetIcon(Android.Resource.Drawable.IcMenuCloseClearCancel); | |
return true; | |
} | |
public override bool OnOptionsItemSelected(IMenuItem item) | |
{ | |
switch (item.TitleFormatted.ToS()) | |
{ | |
case "Config": | |
_presenter.GotoConfig(); | |
return true; | |
case "Exit": | |
_presenter.ExitApplication(); | |
return true; | |
default: | |
return base.OnOptionsItemSelected(item); | |
} | |
} | |
private void listView_ItemClick(object sender, ItemEventArgs e) | |
{ | |
_presenter.ViewPortfolio(e.Position); | |
} | |
private void addPortfolioButton_Click(object sender, EventArgs e) | |
{ | |
_presenter.AddNewPortfolio(); | |
} | |
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) | |
{ | |
base.OnActivityResult(requestCode, resultCode, data); | |
_presenter.RefreshPortfolioList(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment