2016-05-19 12 views
1

基本的にニュースフィードリーダーであるアンドロイドのアプリを開発中です。私は1つのウェブサイトからxmlを解析しています。今はタイトル、日付、作家などを表すリストビューを持っていますが、ユーザーがそのアイテムをクリックしてそのアイテムを開き、テキスト(ニュース)これは私のコードです: `Item with AndroidのxamarinでListViewを表示

using System; 
using System.Collections.Generic; 
using Android.App; 
using Android.Widget; 
using Android.Views; 
using Android.Media; 


namespace NewsFeedReader 
{ 
public class FeedItemListAdapter : BaseAdapter<FeedItem> 
{ 
    protected Activity context; 
    protected List<FeedItem> feedList = new List<FeedItem>(); 
    public FeedItemListAdapter (Activity context, List<FeedItem> feedList) : base() 
    { 
     this.context = context; 
     this.feedList = feedList; 
    } 

    public override FeedItem this [int position] 
    { 
     get { return this.feedList [position]; } 
    } 

    public override long GetItemId (int position) 
    { 
     return position; 
    } 

    public override int Count 
    { 
     get { 
      return this.feedList.Count; 
     } 
    } 
    public override View GetView (int position, View convertView, ViewGroup parent) 
    { 
     var feedItem = this.feedList [position]; 
     var view = convertView ?? context.LayoutInflater.Inflate (Resource.Layout.FeedLayout, parent, false) as LinearLayout; 
     view.FindViewById<TextView> (Resource.Id.Title).Text = feedItem.Title.Length < 50 ? feedItem.Title : feedItem.Title.Substring (0, 50) + "..."; 
     view.FindViewById<TextView> (Resource.Id.writer).Text = feedItem.Creator; 
     view.FindViewById<TextView> (Resource.Id.PubDate).Text = feedItem.PubDate.ToString ("dd/MM/yyyy HH:mm"); 
     var imageView = view.FindViewById<ImageView> (Resource.Id.ListviewImage); 
     Koush.UrlImageViewHelper.SetUrlDrawable (imageView, feedItem.Image, Resource.Drawable.Icon); 
     return view; 
    } 
} 
}` 

using System; 
using System.Collections.Generic; 
using System.Net; 
using System.IO; 
using System.Xml; 

namespace NewsFeedReader 
{ 
    static internal class FeedService 
    { 
    internal static List<FeedItem> GetFeedItems (string url) 
    { 
     List<FeedItem> FeedItemList = new List<FeedItem>(); 

     try 
     { 
     WebRequest webRequest = WebRequest.Create (url); 
     WebResponse webResponse = webRequest.GetResponse(); 
     Stream stream = webResponse.GetResponseStream(); 

     XmlDocument xmlDoc = new XmlDocument(); 
     xmlDoc.Load (stream); 
     XmlNamespaceManager xmlNM = new XmlNamespaceManager(xmlDoc.NameTable); 
     xmlNM.AddNamespace("dc", xmlDoc.DocumentElement.GetNamespaceOfPrefix("dc")); 
     xmlNM.AddNamespace("content", xmlDoc.DocumentElement.GetNamespaceOfPrefix("content")); 

     XmlNodeList xmlNode = xmlDoc.SelectNodes("rss/channel/item"); 

      for (int i = 0; i < xmlNode.Count; i++) 
      { 
       FeedItem feedItem = new FeedItem(); 

       if (xmlNode[i].SelectSingleNode("title") != null) 
       { 
        feedItem.Title = xmlNode[i].SelectSingleNode("title").InnerText; 
       } 
       if (xmlNode[i].SelectSingleNode("content:encoded", xmlNM) != null) 
       { 
        feedItem.Content = xmlNode[i].SelectSingleNode("content:encoded", xmlNM).InnerText; 
       } 
       if (xmlNode[i].SelectSingleNode("link") != null) 
       { 
        feedItem.Link = xmlNode[i].SelectSingleNode("link").InnerText; 
       } 
       if (xmlNode[i].SelectSingleNode("pubDate") != null) 
       { 
        feedItem.PubDate = Convert.ToDateTime(xmlNode[i].SelectSingleNode("pubDate").InnerText); 
       } 
       if (xmlNode[i].SelectSingleNode("category") != null) 
       { 
        feedItem.Category = xmlNode[i].SelectSingleNode("category").InnerText; 
       } 
       if (xmlNode[i].SelectSingleNode("description") != null) 
       { 
        feedItem.Description = xmlNode[i].SelectSingleNode("description").InnerText; 
       } 
       if (xmlNode[i].SelectSingleNode("image") != null) 
       { 
        feedItem.Image = xmlNode[i].SelectSingleNode("image").InnerText; 
       } 
       if (xmlNode[i].SelectSingleNode("dc:creator", xmlNM) != null) 
       { 
        feedItem.Creator = xmlNode[i].SelectSingleNode("dc:creator", xmlNM).InnerText; 
       } 
       else 
       { 
        feedItem.Content = feedItem.Description; 
       } 
       FeedItemList.Add(feedItem); 
      } 

     } 

     catch(Exception) 
     { 
      throw; 
     } 
     return FeedItemList; 
    } 
} 
} 



    using System; 
    using Android.Widget; 

    namespace NewsFeedReader 
{ 
    public class FeedItem 
{ 
    public FeedItem() 
    { 
    } 

    public string Title { 
     get; 
     set; 
    } 
    public string Content { 
     get; 
     set; 
    } 
    public DateTime PubDate { 
     get; 
     set; 
    } 
    public string Creator { 
     get; 
     set; 
    } 
    public string Description { 
     get; 
     set; 
    } 
    public string Category { 
     get; 
     set; 
    } 
    public string Link { 
     get; 
     set; 
    } 
    public string Image { 
     get; 
     set; 
    } 
} 

}

そして今、私は私が問題を抱えている一部を掲載します:ここでは

using System; 
using System.Collections.Generic; 
using System.Threading.Tasks; 
using Newtonsoft.Json; 
using Android.App; 
using Android.Content; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 
using Android.OS; 
using Android.Support.V7.App; 
using ToolbarV7 = Android.Support.V7.Widget.Toolbar; 
using Android.Support.V4.Widget; 

namespace NewsFeedReader 
{ 
[Activity(Label = "Krajina.ba", MainLauncher = true, Icon = "@drawable/icon", Theme="@style/MyTheme")] 
public class MainActivity : ActionBarActivity 
{ 
    private ActionBarDrawerToggle actionBarDrawerToggle; 
    Context context; 
    ToolbarV7 toolbar; 
    DrawerLayout drawerLayout; 
    ListView leftListView; 
    ListView rightListView; 
    ArrayAdapter leftArrayAdapter; 
    ArrayAdapter rightArrayAdapter; 
    List<string> leftList; 
    List<string> rightList; 

    private HorizontalScrollView horizontalScroll; 
    private List<FeedItem> list; 
    private ListView feedItemLisView; 
    private ProgressDialog progressDialog; 


    public static string MTitle = ""; 
    public static string Pubdate = ""; 
    public static string Description = ""; 

    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     // Set our view from the "main" layout resource 
     SetContentView(Resource.Layout.Main); 
     drawerLayout = FindViewById<DrawerLayout> (Resource.Id.drawer_layout); 
     leftListView = FindViewById<ListView> (Resource.Id.left_drawer); 
     rightListView = FindViewById<ListView> (Resource.Id.right_drawer); 
     toolbar = FindViewById<ToolbarV7> (Resource.Id.toolbar); 
     leftListView.Tag = 0; 
     rightListView.Tag = 1; 
     actionBarDrawerToggle = new ActionBarDrawerToggle (
      this, 
      drawerLayout, 
      Resource.String.OpenDrawer, 
      Resource.String.ClosedDrawer 
     ); 
     this.feedItemLisView = this.FindViewById<ListView> (Resource.Id.feedItemListView); 
     //this.feedItemListViewTop = this.FindViewById<ListView> (Resource.Id.feedItemListViewTop); 
     this.horizontalScroll = this.FindViewById<HorizontalScrollView> (Resource.Id.myHorizontalScroll); 

     leftList = new List<string>(); 
     leftList.Add ("BIH"); 
     leftList.Add ("SPORT"); 
     leftList.Add ("SVIJET"); 
     leftList.Add ("MAGAZIN"); 
     leftList.Add ("SCITECH"); 
     leftList.Add ("ZANIMLJIVOSTI"); 

     leftArrayAdapter = new ArrayAdapter<string> (
      this, 
      Android.Resource.Layout.SimpleListItem1, 
      leftList); 
     leftListView.Adapter = leftArrayAdapter; 

     rightList = new List<string>(); 
     rightList.Add ("BIHAĆ"); 
     rightList.Add ("CAZIN"); 
     rightList.Add ("BOSANSKA KRUPA"); 
     rightList.Add ("BUŽIM"); 
     rightList.Add ("BOSANSKI PETROVAC"); 
     rightList.Add ("VELIKA KLADUŠA"); 
     rightList.Add ("KLJUČ"); 
     rightList.Add ("SANSKI MOST"); 

     rightArrayAdapter = new ArrayAdapter<string> (
      this, 
      Android.Resource.Layout.SimpleListItem1, 
      rightList); 
     rightListView.Adapter = rightArrayAdapter; 

     SetSupportActionBar (toolbar); 
     drawerLayout.SetDrawerListener (actionBarDrawerToggle); 
     SupportActionBar.SetHomeButtonEnabled (true); 
     SupportActionBar.SetDisplayHomeAsUpEnabled (true); 
     actionBarDrawerToggle.SyncState(); 

     this.progressDialog = new ProgressDialog (this); 
     this.progressDialog.SetMessage ("Aplikacija u pripremi..."); 

     GetItemList(); 
    } 
    private void GetItemList() 
    { 
     this.progressDialog.Show(); 

     Task<List<FeedItem>> task = Task.Factory.StartNew (() => { 
      return FeedService.GetFeedItems ("http://www.krajina.ba/feed/"); 
     }); 

     Task task2 = task.ContinueWith ((s) => { 
      try { 
       this.progressDialog.Dismiss(); 
       this.list = s.Result; 
       this.PopulateListView(this.list); 
      } 

      catch (AggregateException ex) 
      { 
       Toast.MakeText (this, ex.InnerException.Message, ToastLength.Short).Show(); 
      } 
     }, TaskScheduler.FromCurrentSynchronizationContext()); 
    } 
    private void PopulateListView(List<FeedItem> listView) 
    { 
     var adapter = new FeedItemListAdapter (this, listView); 
     this.feedItemLisView.Adapter = adapter; 
     this.feedItemLisView.ItemClick += (object sender, AdapterView.ItemClickEventArgs e) => 
     { 
      var myAdpter = e.Parent.GetItemAtPosition(e.Position); 
      FeedItem items = new FeedItem(); 
      var newsDetail = new Intent(Application.Context, typeof(FeedDetails)); 
      newsDetail.PutExtra(MTitle, items.Title); 
      newsDetail.PutExtra(Description, items.Content); 
      StartActivity(newsDetail); 
      /*Intent i = new Intent(this, typeof(FeedDetails)); 
      i.PutExtra("item", JsonConvert.SerializeObject(items)); 
      StartActivity(i);*/ 
     }; 
    } 

    private void PopulateLayout(List<FeedItem> feedItems) 
    { 
     var adapter = new MainFeedAdapter (this, feedItems); 
     //this.horizontalScroll.Adapter = adapter; 
    } 
    public override bool OnOptionsItemSelected (IMenuItem item) 
    { 
     switch (item.ItemId) 
     { 
     case Android.Resource.Id.Home: 
      drawerLayout.CloseDrawer (rightListView); 
      actionBarDrawerToggle.OnOptionsItemSelected (item); 
      return true; 

     case Resource.Id.action_refresh: 
      return true; 

     case Resource.Id.action_help: 
      if (drawerLayout.IsDrawerOpen (rightListView)) { 
       drawerLayout.CloseDrawer (rightListView); 
      } else { 
       drawerLayout.OpenDrawer (rightListView); 
       drawerLayout.CloseDrawer (leftListView); 
      } 
      return true; 
     default: 
      return base.OnOptionsItemSelected (item); 
     } 

    } 
    public override bool OnCreateOptionsMenu (IMenu menu) 
    { 
     MenuInflater.Inflate (Resource.Menu.action_menu, menu); 
     return base.OnCreateOptionsMenu (menu); 
    } 

} 

}

はMainActivityとOPからデータを受信しようとしましたニュース記事エン:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Newtonsoft.Json; 
using System.Threading.Tasks; 
using Android.App; 
using Android.Content; 
using Android.OS; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 

namespace NewsFeedReader 
{ 
[Activity (Label = "FeedDetails")]   
public class FeedDetails : Activity 
{ 
    FeedItem list = new FeedItem(); 
    public static string title = ""; 
    public static string description = ""; 

    protected override void OnCreate (Bundle savedInstanceState) 
    { 
     base.OnCreate (savedInstanceState); 


     // Create your application here 
     SetContentView(Resource.Layout.FeedDetails); 
     //FeedItem feedItem = JsonConvert.DeserializeObject<FeedItem> (Intent.GetStringExtra("item")); 
     title = Intent.GetStringExtra(MainActivity.MTitle); 
     description = Intent.GetStringExtra (MainActivity.Description); 

     FindViewById<TextView> (Resource.Id.FeedDetailsTitle).Text = title; 
     FindViewById<TextView> (Resource.Id.FeedDetailsContent).Text = description; 

    } 
} 

}

あなたは私が達成するために、どのようにそれを解決することができますしたいかを知ることができます願っています。ありがとうございました!

+0

元の回答と受諾後に質問が大きく変更されました。 jonpの答えははるかに頑強で、新しい質問に対しては正しいです。 –

+0

はい、ありがとうございます。 – Yupi

答えて

1

(。。この質問はまたxamarin-android gitter channelに頼まれたここにまとめる)

あなたのアプリとの2つの相互の問題があります。

  1. Intent.PutExtra()は鍵が含まれていることが必要です「パッケージプレフィックス」
  2. 実際にはIntent.PutExtra()。 (1)について

は、PutExtra()使い方を思い出す:

partial class MainActivity { 
    public static string MTitle = ""; 
    public static string Description = ""; 

    void PopulateListView(List<FeedItem> listView) 
    { 
     ... 
     var newsDetail = new Intent(...); 
     newsDetail.PutExtra(MTitle,  items.Title); 
     newsDetail.PutExtra(Description, items.Description); 
    } 
} 

問題がMTitleDescriptionどちらが含まれていることである "パッケージ接頭辞を。"さらに悪いことに、彼らはのと同じ値を持っています。これは、newsDetail.PutExtra(Description, ...)コールがになり、newsDetail.PutExtra(MTitle, ...)コールの値がに置き換わることを意味します。

修正は、これらのキーのためのユニークな、非空の値、提供することである:(2)に関して

partial class MainActivity { 
    public const string MTitle  = "your.package.name.Title"; 
    public const string Description = "your.package.name.Description"; 
} 

を、より多くのコンテキストで、newsDetail.PutExtra()コードをリコール:

newsDetail = new Intent(Application.Context, typeof(FeedDetails)); 
FeedItem items = new FeedItem(); 
newsDetail.PutExtra(MTitle, items.Title); 
newsDetail.PutExtra(Description, items.Content); 

問題ここではitemsは初期化されていませんしたがって、items.Titleitems.Contentです。は空文字列です。これを修正するには、これらの値を初期化してください。

var item = adapter [e.Position]; 
newsDetail = new Intent(Application.Context, typeof(FeedDetails)); 
FeedItem items = new FeedItem() { 
    Title = item.Title, 
    Content = item.Content, 
}; 
newsDetail.PutExtra(MTitle, items.Title); 
newsDetail.PutExtra(Description, items.Content); 
+0

ありがとうございました:)(Y) – Yupi

2
private void PopulateListView(List<FeedItem> listView) 
    { 
     var adapter = new FeedItemListAdapter (this, listView); 
     this.feedItemLisView.Adapter = adapter; 
     this.feedItemLisView.ItemClick += (object sender, AdapterView.ItemClickEventArgs e) => 
     { 
      var myitem = adapter.GetItemAtPosition(e.Position); 
      //do something with selected feeditem 
     }; 
+0

ありがとうございます。あなたの答えを少し説明できますか? – Yupi

+0

提供された回答により、ニュースフィード内のアイテムにアクセスできます。それが私だったら、新しいレイアウトで新しい活動を開始して、ニュースフィード項目のデータを表示するか、同じことを断片で行います。あなたのアプリケーションは実際には、コンテンツのクリックのためのリストのためのマスター/詳細ページ1を持つ良いXamarin.Forms候補を作るのに十分に単純です。 –

+0

はい、それは新しいレイアウトで新しいアクティビティを開始する計画でしたが、すでに両方作成されていましたが、ここで私はそのアクティビティを起動してレイアウトのデータを表示する場所にこだわりました。私はXamarinについて考えていました。フォームですが、残念ながら私はAppleデバイスを持っていないので、iOS向けにコードをコンパイルすることはできません。あなたの時間と助けてくれてありがとう。 – Yupi

関連する問題