Skip to content

Instantly share code, notes, and snippets.

@gavilanch
Created October 5, 2017 02:32
Show Gist options
  • Save gavilanch/0a593fae9241058a702caef8570eb337 to your computer and use it in GitHub Desktop.
Save gavilanch/0a593fae9241058a702caef8570eb337 to your computer and use it in GitHub Desktop.
// 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