Skip to content

Commit

Permalink
version 1.2
Browse files Browse the repository at this point in the history
  • Loading branch information
Tlaster committed Jan 4, 2016
1 parent cfb7616 commit 49102b2
Show file tree
Hide file tree
Showing 32 changed files with 1,108 additions and 5,093 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,15 @@
using System.Net;
using System;
using System.Threading.Tasks;
using Android.Support.V7.Widget;

namespace AnimateRaw.Android
{
[Activity(Label = "Detail")]
public class DetailActivity : Activity
{
private double _id;
private ListView _listView;
private ExRecyclerView _exRecyclerView;
private string _name;
private ScrollChildSwipeRefreshLayout _refresher;

Expand All @@ -52,8 +53,8 @@ protected override async void OnCreate(Bundle savedInstanceState)
}

SetContentView(Resource.Layout.MainPage);
_listView = FindViewById<ListView>(Resource.Id.MainPageListView);
_listView.ItemClick += listView_ItemClick;
_exRecyclerView = FindViewById<ExRecyclerView>(Resource.Id.MainPageRecyclerView);
_exRecyclerView.ViewLayoutManager = new GridLayoutManager(this, 3);
_refresher = FindViewById<ScrollChildSwipeRefreshLayout>(Resource.Id.MainPageRefresher);
_refresher.SetColorSchemeResources(Resource.Color.MediumVioletRed);
_refresher.Refresh += refresher_Refresh;
Expand All @@ -66,37 +67,24 @@ private async void refresher_Refresh(object sender, EventArgs e)
await Refresh();
}

private async void listView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
{
var item = (_listView.Adapter as DetailListAdapter).Items[e.Position];
try
{
using (var client = new HttpClient())
await client.GetStringAsync($"http://tlaster.me/getanimate?id={_id}&filename={item.FileName}");
}
catch
{
}
var intent = new Intent(Intent.ActionView);
intent.SetDataAndType(global::Android.Net.Uri.Parse(item.FilePath), "video/mp4");
StartActivity(intent);
}

private async Task Refresh()
{
try
{
using (var client = new HttpClient())
{
var jsstr = await client.GetStringAsync($"http://tlaster.me/getanimate?id={_id}");
var jsstr = await client.GetStringAsync($"http://tlaster.me/api/detail?id={_id}");
var list = (from item in (JArray)((JObject)JsonConvert.DeserializeObject(jsstr))["SetList"]
select new AnimateSetModel
{
ClickCount = item.Value<double>("ClickCount"),
FileName = item.Value<string>("FileName"),
FilePath = item.Value<string>("FilePath"),
FileThumb = item.Value<string>("FileThumb"),
}).OrderBy(a => a.FileName).ToList();
_listView.Adapter = new DetailListAdapter(this, list);
var ada = new DetailListAdapter(this, list);
ada.ItemClick += Ada_ItemClick;
_exRecyclerView.ViewAdapter = ada;
_refresher.Refreshing = false;
}
}
Expand All @@ -107,5 +95,20 @@ private async Task Refresh()
}
}

private async void Ada_ItemClick(object sender, int e)
{
var item = (_exRecyclerView.ViewAdapter as DetailListAdapter).Items[e];
try
{
using (var client = new HttpClient())
await client.GetStringAsync($"http://tlaster.me/api/detail?id={_id}&filename={item.FileName}");
}
catch
{
}
var intent = new Intent(Intent.ActionView);
intent.SetDataAndType(global::Android.Net.Uri.Parse(item.FilePath), "video/mp4");
StartActivity(intent);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,20 @@
using Android.Graphics;
using Android.Support.V4.Widget;
using System.Net;
using System.Collections.ObjectModel;
using Android.Support.V7.Widget;

namespace AnimateRaw.Android
{
[Activity(Label = "Animate Raw", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
private ListView _listView;
private ExRecyclerView _recyclerView;
private SwipeRefreshLayout _refresher;
private bool _isLoading;
private int _page = 0;
private bool _hasMore = true;
private LinearLayoutManager _layoutManager;

protected override async void OnCreate(Bundle bundle)
{
Expand All @@ -43,25 +49,56 @@ protected override async void OnCreate(Bundle bundle)
}
base.OnCreate(bundle);
SetContentView(Resource.Layout.MainPage);
_listView = FindViewById<ListView>(Resource.Id.MainPageListView);
_listView.ItemClick += listView_ItemClick;
_recyclerView = FindViewById<ExRecyclerView>(Resource.Id.MainPageRecyclerView);
_recyclerView.OnScroll += recyclerView_OnScroll;
_layoutManager = new LinearLayoutManager(this);
_recyclerView.ViewLayoutManager = _layoutManager;
_refresher = FindViewById<ScrollChildSwipeRefreshLayout>(Resource.Id.MainPageRefresher);
_refresher.SetColorSchemeResources(Resource.Color.MediumVioletRed);
_refresher.Refresh += refresher_Refresh;
_refresher.Post(() => _refresher.Refreshing = true);
await Refresh();
}

private void listView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
private void recyclerView_OnScroll(object sender, OnScrollEventArgs e)
{
var item = (_listView.Adapter as MainListAdapter).Items[e.Position];
var intent = new Intent(this, typeof(DetailActivity));
Bundle bundle = new Bundle();
bundle.PutString("name", item.Name);
bundle.PutDouble("id", item.ID);
intent.PutExtras(bundle);
StartActivity(intent);
if (e.dy > 0)
{
var visibleItemCount = _layoutManager.ChildCount;
var totalItemCount = _layoutManager.ItemCount;
var pastVisiblesItems = _layoutManager.FindFirstVisibleItemPosition();

if (!_isLoading)
{
if ((visibleItemCount + pastVisiblesItems) >= totalItemCount - 3)
{
_isLoading = true;
LoadMore();
}
}
}
}


private async void LoadMore()
{
using (var client = new HttpClient())
{
var jsstr = await client.GetStringAsync($"http://tlaster.me/api/list?page={_page++}");
var obj = (JObject)JsonConvert.DeserializeObject(jsstr);
_hasMore = (bool)obj["HasMore"];
var list = (from item in (JArray)obj["List"]
select new AnimateListModel
{
ID = item.Value<int>("ID"),
Name = item.Value<string>("Name"),
LastUpdateBeijing = DateTime.Parse(item.Value<string>("LastUpdate")),
}).ToList();
(_recyclerView.ViewAdapter as MainListAdapter).Add(list);
_isLoading = false;
}
}


private async void refresher_Refresh(object sender, EventArgs e)
{
Expand All @@ -74,16 +111,20 @@ private async System.Threading.Tasks.Task Refresh()
{
using (var client = new HttpClient())
{
var jsstr = await client.GetStringAsync("http://tlaster.me/getanimate");

var list = (from item in (JArray)JsonConvert.DeserializeObject(jsstr)
_page = 0;
var jsstr = await client.GetStringAsync($"http://tlaster.me/api/list?page={_page++}");
var obj = (JObject)JsonConvert.DeserializeObject(jsstr);
_hasMore = (bool)obj["HasMore"];
var list = (from item in (JArray)obj["List"]
select new AnimateListModel
{
ID = item.Value<int>("ID"),
Name = item.Value<string>("Name"),
LastUpdate = TimeZoneInfo.ConvertTime(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("China Standard Time")) - DateTime.Parse(item.Value<string>("LastUpdate")),
}).OrderBy(a => a.LastUpdate).ToList();
_listView.Adapter = new MainListAdapter(this, list);
LastUpdateBeijing = DateTime.Parse(item.Value<string>("LastUpdate")),
}).ToList();
var ada = new MainListAdapter(this, list);
ada.ItemClick += Ada_ItemClick;
_recyclerView.ViewAdapter = ada;
_refresher.Refreshing = false;
}
}
Expand All @@ -93,6 +134,17 @@ private async System.Threading.Tasks.Task Refresh()
_refresher.Refreshing = false;
}
}

private void Ada_ItemClick(object sender, int e)
{
var item = (_recyclerView.ViewAdapter as MainListAdapter).Items[e];
var intent = new Intent(this, typeof(DetailActivity));
Bundle bundle = new Bundle();
bundle.PutString("name", item.Name);
bundle.PutDouble("id", item.ID);
intent.PutExtras(bundle);
StartActivity(intent);
}
}
}

54 changes: 41 additions & 13 deletions AnimateRaw.Android/Adapter/DetailListAdapter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,16 @@
using Android.Views;
using Android.Widget;
using AnimateRaw.Shared.Model;
using Android.Support.V7.Widget;
using AnimateRaw.Android.ViewHolder;
using Android.Graphics;
using System.Net.Http;

namespace AnimateRaw.Android.Adapter
{
public class DetailListAdapter : BaseAdapter<AnimateSetModel>
public class DetailListAdapter : RecyclerView.Adapter
{
public event EventHandler<int> ItemClick;
public List<AnimateSetModel> Items { get; private set; }
private Activity _context;
public DetailListAdapter(Activity context, List<AnimateSetModel> items) : base()
Expand All @@ -26,23 +31,46 @@ public override long GetItemId(int position)
{
return position;
}
public override AnimateSetModel this[int position]

public override int ItemCount => Items.Count;

public override async void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
get { return Items[position]; }
DetailViewHolder vh = holder as DetailViewHolder;
vh.Name.Text = Items[position].FileName;
vh.ClickCount.Text = $"Click Count:{Items[position].ClickCount}";
if (string.IsNullOrEmpty(Items[position].FileThumb))
{
vh.Image.SetBackgroundColor(Color.MediumVioletRed);
vh.Image.SetImageResource(Resource.Drawable.SplashScreen);
}
else
{

vh.Image.SetImageBitmap(await GetImageBitmapFromUrl(Items[position].FileThumb));
}
}
public override int Count
private async System.Threading.Tasks.Task<Bitmap> GetImageBitmapFromUrl(string url)
{
get { return Items.Count; }
Bitmap imageBitmap = null;
using (var client = new HttpClient())
{
var imageBytes = await client.GetByteArrayAsync(url);
if (imageBytes != null && imageBytes.Length > 0)
{
imageBitmap = BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length);
}
}
return imageBitmap;
}
public override View GetView(int position, View convertView, ViewGroup parent)

public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
View view = convertView;
if (view == null)
view = _context.LayoutInflater.Inflate(Resource.Layout.MainListLayout, null);
view.FindViewById<TextView>(Resource.Id.MainListLayoutName).Text = Items[position].FileName;
view.FindViewById<TextView>(Resource.Id.MainListLayoutUpdateTime).Text = $"Click Count:{Items[position].ClickCount}";
return view;
View itemView = LayoutInflater.From(parent.Context).
Inflate(Resource.Layout.DetailListLayout, parent, false);
DetailViewHolder vh = new DetailViewHolder(itemView);
itemView.Click += (s, e) => ItemClick?.Invoke(s, vh.LayoutPosition);
return vh;
}

}
}
52 changes: 30 additions & 22 deletions AnimateRaw.Android/Adapter/MainListAdapter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,39 +10,31 @@
using Android.Views;
using Android.Widget;
using AnimateRaw.Shared.Model;
using System.Collections.ObjectModel;
using Android.Support.V7.Widget;

namespace AnimateRaw.Android.Adapter
{
public class MainListAdapter : BaseAdapter<AnimateListModel>
public class MainListAdapter : RecyclerView.Adapter
{
public event EventHandler<int> ItemClick;

public List<AnimateListModel> Items { get; private set; }
private Activity _context;
public MainListAdapter(Activity context, List<AnimateListModel> items) : base()
{
this._context = context;
this.Items = items;
}
public override long GetItemId(int position)
{
return position;
}
public override AnimateListModel this[int position]
{
get { return Items[position]; }
}
public override int Count
{
get { return Items.Count; }
_context = context;
Items = items;
}
public override View GetView(int position, View convertView, ViewGroup parent)
public void Add(List<AnimateListModel> list)
{
View view = convertView;
if (view == null)
view = _context.LayoutInflater.Inflate(Resource.Layout.MainListLayout, null);
view.FindViewById<TextView>(Resource.Id.MainListLayoutName).Text = Items[position].Name;
view.FindViewById<TextView>(Resource.Id.MainListLayoutUpdateTime).Text = GetUpdate(Items[position].LastUpdate);
return view;
Items.AddRange(list);
NotifyDataSetChanged();
}
public override long GetItemId(int position) => position;

public override int ItemCount => Items.Count;

private string GetUpdate(TimeSpan time)
{
if (time.Days != 0)
Expand All @@ -59,5 +51,21 @@ private string GetUpdate(TimeSpan time)
}
return "Just now";
}

public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
MainViewHolder vh = holder as MainViewHolder;
vh.Name.Text = Items[position].Name;
vh.UpdateTime.Text = GetUpdate(Items[position].LastUpdate);
}

public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
View itemView = LayoutInflater.From(parent.Context).
Inflate(Resource.Layout.MainListLayout, parent, false);
MainViewHolder vh = new MainViewHolder(itemView);
itemView.Click += (s, e) => ItemClick?.Invoke(s, vh.LayoutPosition);
return vh;
}
}
}

0 comments on commit 49102b2

Please sign in to comment.