Xamarin.Android ListVIew(Twitterクライアント風味)
1 Tweetinvi APIせっかくListViewの使い方を学んだので、ちょっとTwitter風味に表示してみました。
Twitterへのアクセスは、「Tweetinvi a friendly Twitter C# API」を使用させて頂きました。
https://tweetinvi.codeplex.com/
NuGetで取得なので、パッケージマネージャコンソールから「Install-Package TweetinviAPI」とタイプするだけです。
2 実装
「xamarin」という文字列を日本語対象で検索して表示しただけです。
1アイテムのデータ構造を定義しました。
public class ListItem{ public Bitmap Icon; //投稿者アイコン public string Name; //名前 public string Text; //メッセージ public string CreateAt; //作成日時 }
表示カスタマイズ用のAdapterクラスです。
public class MyAdapter : ArrayAdapter<ListItem>{ private readonly LayoutInflater _layoutInflater; public MyAdapter(Context context, int rid, IList<ListItem> list) : base(context, rid, list){ _layoutInflater = (LayoutInflater) context.GetSystemService(Context.LayoutInflaterService); } public override View GetView(int position, View convertView, ViewGroup parent){ //データを取り出す var item = GetItem(position); //レイアウトファイルからViewを作成 var view = _layoutInflater.Inflate(Resource.Layout.ListItem, null); //投稿者アイコン var icon = view.FindViewById<ImageView>(Resource.Id.imageIcon); icon.SetImageBitmap(item.Icon); //名前 var name = view.FindViewById<TextView>(Resource.Id.textName); name.Text = item.Name; //コメント var text = view.FindViewById<TextView>(Resource.Id.textText); text.Text = item.Text; //作成日時 var textCreateAt = view.FindViewById<TextView>(Resource.Id.textCreateAt); textCreateAt.Text = item.CreateAt; return view; } }
メインは、こんな感じになります。
//TweetinviAPI 認証情報の初期化 const string accessToken = "XXXXa9xOKb4EvKrxi"; const string accessTokenSecret = "XXXXXlu8Iq8vy"; const string consumerKey = "XXXXXXxWneCwGp"; const string consumerSecret = "XXXXXXXUMNcIrSTiJ"; TwitterCredentials.SetCredentials(accessToken, accessTokenSecret, consumerKey, consumerSecret); // 「xamarin」を含む、日本語Tweetを検索 var searchParameter = Search.GenerateSearchTweetParameter("xamarin"); searchParameter.Lang = Language.Japanese; var tweets = Search.SearchTweets(searchParameter); //検索結果からデータを作成する var list = new List<ListItem>(); foreach (var tweet in tweets) { //投稿者アイコンのURLから画像を作成する var url = new URL(tweet.Creator.ProfileImageUrl); var connection = (HttpURLConnection) url.OpenConnection(); connection.DoInput = true; connection.Connect(); var icon = BitmapFactory.DecodeStream(connection.InputStream); var listItem = new ListItem(){ Name = tweet.Creator.Name,//投稿者 CreateAt = tweet.CreatedAt.ToString(),//作成日時 Text = tweet.Text,//メッセージ Icon = icon//投稿者アイコン }; list.Add(listItem); } //ListViewのアダプタにセットする var listView = FindViewById<ListView>(Resource.Id.listView1); listView.Adapter = new MyAdapter(this, 0, list);