2016-12-30 2 views
1

Друзья хорошего дня, это мое первое приложение для Android, я пытаюсь получить данные из app app и отображать их в виде списка. Теперь я расскажу свои шаги первым, что сделал класс, и этот класс получает данные через HTTP-запрос.Получить данные с запросом HTTP Android Xamarin C#

class WebRequests 
{ 
    public static List<Item> GetAllItems() 
    { 
     List<Item> lp = new List<Item>(); 
     HttpClient client = new HttpClient(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
     try 
     { 
      HttpResponseMessage response = client.GetAsync("https://MyUrlToApi/api/myitems").Result; 
      if (response.IsSuccessStatusCode) 
      { 
       lp = JsonConvert.DeserializeObject<Item[]>(response.Content.ReadAsStringAsync().Result).ToList(); 
      } 
     } 
     catch 
     { 

     } 
     return lp; 
    } 

Я сделал модель со свойствами элементов:

public class Item 
{ 
    public string Id { get; set; } 
    public string Content { get; set; } 

} 

И моя основная деятельность:

[Activity(Label = "GetDataFromWebApiAndroid", MainLauncher = true, Icon = "@drawable/icon")] 
public class MainActivity : Activity 
{ 
    ListView listView; 
    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     // Set our view from the "main" layout resource 
     SetContentView (Resource.Layout.Main); 
     var result = WebRequests.GetAllItems(); 

     listView = FindViewById<ListView>(Resource.Id.listAll); 
     listView.Adapter = new ArrayAdapter(this, Android.Resource.Layout.SimpleListItem1, result); 
     listView.ChoiceMode = ChoiceMode.None; 
    } 
} 

Так что, когда я бегу мое приложение мой список вид отображает этот : enter image description here

Но мои данные есть: enter image description here

Может кто-нибудь помочь мне и объяснить, что я делаю неправильно.

+1

Я никогда не работал с Xamarin или C#, но, глядя на скриншот и код, кажется, что 'ArrayAdapter' не может правильно отобразить данный список объектов:' List ', который имеет смысл. например: как адаптер должен знать, что отображать в списке ?, только «идентификатор» элемента? или «Контент» или, может быть, все вместе? Я считаю, что вам нужен пользовательский адаптер. –

+0

Большое спасибо, поскольку я вижу, что я должен узнать больше о пользовательских адаптерах - пользовательский адаптер свяжет данные да? –

+1

Точно, пользовательские адаптеры используются для связывания сложных данных с представлением списка. –

ответ

2

Я нашел решение, возможно, это поможет новым разработчикам Android. Особая благодарность AndyRes для правильного пути. Чтобы правильно отображать данные, я должен создать пользовательский адаптер для привязки данных. Сначала необходимо создать класс Item, я звоню ему модель:

public class Item 
{ 
    public string Id { get; set; } 
    public string Content { get; set; } 

    public Item(string Id, string Content) 
    { 
     this.Id = Id; 
     this.Content = Content; 
    } 
} 

Теперь на заказ адаптер:

class ItemListAdapter : BaseAdapter<Item> 
{ 
    Activity context; 
    public List<Item> listItems { get; set; } 
    public ItemListAdapter(Activity context, List<Item> Items) : base() 
    { 
     this.context = context; 
     this.listItems = Items; 
    } 
    public override Item this[int position] 
    { 
     get 
     { 
      return this.listItems[position]; 
     } 
    } 

    public override int Count 
    { 
     get 
     { 
      return this.listItems.Count; 
     } 
    } 

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

    public override View GetView(int position, View convertView, ViewGroup parent) 
    { 
     Item item = listItems[position]; 
     View view = convertView; 
     if (convertView == null || !(convertView is LinearLayout)) 

      view = context.LayoutInflater.Inflate(Resource.Layout.Itemlayout, parent, false); 
     TextView itemId = view.FindViewById(Resource.Id.textItemId) as TextView; 
     TextView itemContent = view.FindViewById(Resource.Id.textItemContent) as TextView; 

     itemId.SetText(item.Id, TextView.BufferType.Normal); 
     itemContent.SetText(item.Content, TextView.BufferType.Normal); 

     return view; 

    } 
} 

И, наконец, внести изменения в деятельности:

[Activity(Label = "CustomAdapterAndroidApp", MainLauncher = true, Icon = "@drawable/icon")] 
public class MainActivity : Activity 
{ 
    private ListView listItems; 
    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     // Set our view from the "main" layout resource 
     SetContentView (Resource.Layout.Main); 
     listItems = FindViewById<ListView>(Resource.Id.listViewItems); 
     PopulateItemsList(); 
    } 

    private void PopulateItemsList() 
    { 
     listItems.Adapter = new ItemListAdapter(
      this, new List<Item> 
      { 
       new Item("222", "First Sample"), 
       new Item("111", "Второй пример"), 
       new Item("333", "მესამე მანალითი") 
      }); 

    } 

Не стоит забывать для создания специального макета для отображения каждого товара:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
<TextView 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/textItemId" /> 
<TextView 
    android:textAppearance="?android:attr/textAppearanceSmall" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/textItemContent" /> 
</LinearLayout> 

И обязательно список мест в основном макете. Еще раз спасибо.

Смежные вопросы