Created
October 5, 2017 02:32
-
-
Save gavilanch/0a593fae9241058a702caef8570eb337 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
// BaseNewsListFragment.cs | |
protected NewsListAdapter _newsListAdapter; | |
// INotify.cs | |
internal interface INotify | |
{ | |
void NotifyObserver(); | |
} | |
// NewsRepository.cs | |
internal class NewsRepository | |
{ | |
private List<News> _news; | |
private int size = 10; | |
public NewsRepository() | |
{ | |
_news = new List<News>(); | |
for (int i = 1; i <= 30; i++) | |
{ | |
var newNews = new News(); | |
newNews.Body = "Body " + i.ToString(); | |
newNews.Title = "Title " + i.ToString(); | |
newNews.Id = i; | |
newNews.ImageName = chooseImage(i); | |
_news.Add(newNews); | |
} | |
string chooseImage(int discriminant) | |
{ | |
switch (discriminant % 3) | |
{ | |
case 0: | |
return "noticia1.png"; | |
case 1: | |
return "noticia2.png"; | |
case 2: | |
return "noticia3.png"; | |
default: | |
throw new NotImplementedException(); | |
} | |
} | |
} | |
public List<News> GetNews(int page) | |
{ | |
return _news.Skip((page - 1) * size).Take(size).ToList(); | |
} | |
public News GetNewsById(int Id) | |
{ | |
return _news.FirstOrDefault(x => x.Id == Id); | |
} | |
} | |
// newsService.cs | |
public List<News> GetNews(int page) | |
{ | |
return _newsRepository.GetNews(page); | |
} | |
// AllNewsListFragment.cs | |
internal class AllNewsListFragment : BaseNewsListFragment, INotify | |
{ | |
private NewsService _newsService; | |
public int CurrentPage { get; set; } | |
public AllNewsListFragment() | |
{ | |
_newsService = new NewsService(); | |
} | |
public override void OnActivityCreated(Bundle savedInstanceState) | |
{ | |
base.OnActivityCreated(savedInstanceState); | |
if (!_news.Any()) | |
{ | |
CurrentPage = 1; | |
_news = _newsService.GetNews(CurrentPage); | |
} | |
SetupFragment(); | |
_newsListAdapter.RegisterLoadObserver(this); | |
} | |
public void NotifyObserver() | |
{ | |
CurrentPage++; | |
var nextNews = _newsService.GetNews(CurrentPage); | |
if (nextNews.Any()) | |
{ | |
_news.AddRange(nextNews); | |
_newsListAdapter.AddNews(_news); | |
_newsListAdapter.NotifyDataSetChanged(); | |
} | |
} | |
public override void OnCreateOptionsMenu(IMenu menu, MenuInflater inflater) | |
{ | |
if (_selectedNews.Count > 0) | |
{ | |
inflater.Inflate(Resource.Menu.newsActionMenu, menu); | |
} | |
base.OnCreateOptionsMenu(menu, inflater); | |
} | |
public override bool OnOptionsItemSelected(IMenuItem item) | |
{ | |
switch (item.ItemId) | |
{ | |
case Resource.Id.action_read_later: | |
SaveSelectedNews(_selectedNews); | |
return true; | |
default: | |
return base.OnOptionsItemSelected(item); | |
} | |
} | |
private void SaveSelectedNews(List<News> selectedNews) | |
{ | |
try | |
{ | |
var newsLocalService = new NewsLocalService(); | |
foreach (var news in selectedNews) | |
{ | |
newsLocalService.Save(news); | |
} | |
Toast.MakeText(Activity, $"{selectedNews.Count} news saved", ToastLength.Short).Show(); | |
selectedNews.Clear(); | |
Activity.InvalidateOptionsMenu(); | |
UnselectElements(); | |
} | |
catch (Exception ex) | |
{ | |
Toast.MakeText(Activity, ex.Message, ToastLength.Short).Show(); | |
} | |
} | |
} | |
// NewsListAdapter | |
class NewsListAdapter : BaseAdapter<News> | |
{ | |
private Activity _context; | |
private List<News> _news; | |
private ISelectedChecker _selectedChecker; | |
private INotify _loadObserver; | |
public NewsListAdapter(Activity context, List<News> news, ISelectedChecker selectedChecker) | |
{ | |
_context = context; | |
_news = news; | |
_selectedChecker = selectedChecker; | |
} | |
public override News this[int position] => _news[position]; | |
public override int Count => _news.Count; | |
public override long GetItemId(int position) | |
{ | |
return this[position].Id; | |
} | |
public override View GetView(int position, View convertView, ViewGroup parent) | |
{ | |
var item = this[position]; | |
if (convertView == null) | |
{ | |
convertView = _context.LayoutInflater.Inflate(Resource.Layout.NewsListRow, null); | |
} | |
else | |
{ | |
var id = (int)GetItemId(position); | |
RelativeLayout rl = convertView.FindViewById<RelativeLayout>(Resource.Id.newsListRow_RelativeLayout); | |
if (_selectedChecker.IsItemSelected(id)) | |
{ | |
var colorForSelected = _context.Resources.GetString(Resource.Color.listitemselected); | |
rl.SetBackgroundColor(Android.Graphics.Color.ParseColor(colorForSelected)); | |
} | |
else | |
{ | |
var colorForUnselected = _context.Resources.GetString(Resource.Color.listitemunselected); | |
rl.SetBackgroundColor(Android.Graphics.Color.ParseColor(colorForUnselected)); | |
} | |
if (IsEndOfList(position)) | |
{ | |
NotifyLoadObserver(); | |
} | |
} | |
convertView.FindViewById<TextView>(Resource.Id.newsTitle).Text = item.Title; | |
var newsImage = convertView.FindViewById<ImageView>(Resource.Id.newsImage); | |
var imageURL = string.Concat(ValuesService.ImagesBaseURL, item.ImageName); | |
Picasso.With(_context) | |
.Load(imageURL) | |
.Placeholder(_context.GetDrawable(Resource.Drawable.Icon)) | |
.Into(newsImage); | |
return convertView; | |
} | |
internal void AddNews(List<News> news) | |
{ | |
_news = news; | |
} | |
private bool IsEndOfList(int position) | |
{ | |
return position == Count - 1; | |
} | |
public void RegisterLoadObserver(INotify loadObserver) | |
{ | |
_loadObserver = loadObserver; | |
} | |
private void NotifyLoadObserver() | |
{ | |
if (_loadObserver != null) | |
{ | |
_loadObserver.NotifyObserver(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment