【问题标题】:Xamarin forms: Load more items without button clickXamarin 表单:无需单击按钮即可加载更多项目
【发布时间】:2017-12-12 12:38:37
【问题描述】:

亲爱的,

我正在实现在没有按钮的情况下将更多项目加载到列表视图。

我的代码:

 public partial class DashBoardPage : ContentPage
  {
ObservableCollection<string> Items;
bool isLoading;

public DashBoardPage()
{
    InitializeComponent();

    Items = new ObservableCollection<string>();
    var listview = new ListView();

    listview.ItemsSource = Items;
    listview.ItemAppearing += (sender, e) =>
    {
        if (isLoading || Items.Count == 0)
            return;

        //hit bottom!
        if (e.Item.ToString() == Items[Items.Count - 1])
        {
            LoadItems();
        }
    };
    LoadItems();
}

public async void LoadItems()
{
    isLoading = true;
    HttpClient client = new HttpClient();
    var response = await client.GetAsync("My Url");
    string tweetJson = await response.Content.ReadAsStringAsync();

    UserTweetResponse userTweetResponse = new UserTweetResponse();
    if (tweetJson != "")
    {
        userTweetResponse = JsonConvert.DeserializeObject<UserTweetResponse>(tweetJson.ToString());
        foreach (var tweet in userTweetResponse.userTweetsList)
                    {
                        Items.Add(tweet.ToString());
                    }
    }
    ListView1.ItemsSource = userTweetResponse.userTweetsList;
    isLoading = false;
}
}

我参考了以下链接,并与 LoadItems() 中的 for 循环混淆了: https://montemagno.com/load-more-items-at-end-of-listview-in/

for (int i = 0; i < 20; i++) 
 {
  Items.Add (string.Format("Item {0}", Items.Count));
 }

在我的例子中,我使用 itemSource 属性将响应绑定到列表视图。

我的模型课:

 public class UserTweetResponse
   {
      public List<UserTweetsList> userTweetsList { get; set; }
    }
public class UserTweetsList
{
    public int tweetId { get; set; }
    public string tweetData { get; set; }
    public string createdTime { get; set; }
    public int commentCount { get; set; }
    public int likeCount { get; set; }
    public int flagCount { get; set; }
    public string mediaUrl { get; set; }
    public string tweetUser { get; set; }
    public bool userLiked { get; set; }
    public bool userFlagged { get; set; }
    public bool isMediaUrlNull { get { return string.IsNullOrEmpty(mediaUrl); } }
}

我该如何解决这个问题? 在此先感谢

【问题讨论】:

  • 您需要将新项目添加到您的项目集合中。目前您正在替换错误的 ItemsSource。
  • 通过 itemSource 属性,我正在绑定 xaml 中的值。因此,如果我替换它,我将无法在 UI 中显示这些值。我不知道如何向 Items 集合添加新项目。我尝试像 Items = userTweetResponse.userTweetsList;但出现转换错误。 userTweetResponse 是我的模型类对象。
  • 您需要将新推文添加到现有的 Items 集合中,例如 foreach (tweet in userTweetResponse.userTweetsList) { Items.Add(tweet); }
  • 我还建议将您的网络调用代码提取到一个帮助程序类中,这样您就不会在每次加载更多推文时都创建一个新的 HttpClient

标签: xamarin.forms


【解决方案1】:

您需要将新推文添加到您的 Items 集合中

public async void LoadItems()
{
    isLoading = true;
    HttpClient client = new HttpClient();
    var response = await client.GetAsync("My Url");
    string tweetJson = await response.Content.ReadAsStringAsync();

    UserTweetResponse userTweetResponse = new UserTweetResponse();
    if (tweetJson != "")
    {
        userTweetResponse = JsonConvert.DeserializeObject<UserTweetResponse>(tweetJson.ToString());
        foreach (var tweet in userTweetResponse.userTweetsList)
        {
            Items.Add(tweet);
        }
    }
    isLoading = false;
}

因为 Observable 集合是 ListView 项目源,所以新项目将出现在列表中。

【讨论】:

  • “in”出现错误,“foreach 语句中需要类型和标识符”,遗漏了什么?
  • 我错过了来自 foreach 的 var
  • 在 Items.Add(tweet) 中也显示推文错误;在当前上下文中不存在。请看问题,我将模型类详细信息添加到其中....
  • 你必须自己调试那个。我的代码更像是一个建议,而不是一个完整的解决方案。
  • 像这样改变:Items.Add(tweet.ToString());但仍然没有进入命中底部 else 块: if (e.Item.ToString() == Items[Items.Count - 1]) { }
【解决方案2】:

粘贴整个:

using System;
using System.Diagnostics;
using System.Net.Http;
using Newtonsoft.Json;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
using System.Collections.ObjectModel;
using System.Threading.Tasks;

 namespace SmartTweet
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class DashBoardPage : ContentPage
{
    int i = 1;
    bool loadMore;
    ObservableCollection<UserTweetsList> Items =new ObservableCollection<SmartTweet.UserTweetsList>();
    bool isLoading;
    UserTweetResponse userTweetResponse;
    public DashBoardPage()
    {
        InitializeComponent();



        ListView1.ItemAppearing += (sender, e) =>
        {
            if (isLoading || Items!=null &&  Items.Count == 0)
                return;

            //hit bottom
            if (userTweetResponse.userTweetsList!=null && userTweetResponse.userTweetsList.Count>0)
            {
                UserTweetsList item = userTweetResponse.userTweetsList[userTweetResponse.userTweetsList.Count - 1];
                if ((e.Item as UserTweetsList).tweetId.ToString() == item.tweetId.ToString())
                {
                    Debug.WriteLine("Enter bottom");
                    loadMore = true;
                    UserTweetsList();

                }
            }


        };

    }
    protected async override void OnAppearing()
    {
        await UserTweetsList();


        base.OnAppearing();
    }
    async void ButtonClicked(Object sender, EventArgs e)
    {
        loadMore = true;
       // await UserTweetsList();
    }

    public async Task UserTweetsList()
    {
        isLoading = true;
        if (loadMore)
        {
            i = i + 1;
        }
        int countInInt = i * 3;
        try
        {
            string applicationId = "1";
            string siteId = "5";
            string userId = "225";
            string ownedBy = "me";
            string period = "before";
            string count = countInInt.ToString();

            DateTime dt = DateTime.Now.ToLocalTime();
            string date = dt.Year.ToString() + "-" + dt.Month.ToString() + "-" + dt.Day.ToString() + " " + dt.Hour.ToString() + ":" + dt.Minute.ToString() + ":" + dt.Second.ToString() + "." + dt.Millisecond.ToString();

            HttpClient client = new HttpClient();
            var response = await client.GetAsync("web service url");
            string tweetJson = await response.Content.ReadAsStringAsync();
            Debug.WriteLine("tweetList:>" + tweetJson);

             userTweetResponse = new UserTweetResponse();
            if (tweetJson != "")
            {
                userTweetResponse = JsonConvert.DeserializeObject<UserTweetResponse>(tweetJson.ToString());
                foreach (var tweet in userTweetResponse.userTweetsList)
                {
                    if (!Items.Contains(tweet))
                    {
                        Items.Add(tweet);
                    }

                    //Items.Add(tweet.ToString());
                }
            }
            ListView1.ItemsSource = userTweetResponse.userTweetsList;
            isLoading = false;
            if (userTweetResponse.userTweetsList.Count == 0)
            {
                //loadMoreButton.IsVisible = false;
                blue_holo_circle.IsVisible = false;
                blueLine.IsVisible = false;
            }
            else
            {
                //loadMoreButton.IsVisible = true;
                blue_holo_circle.IsVisible = true;
                blueLine.IsVisible = true;
            }

        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine("Exception:>" + ex);
        }
    }
}
 }

【讨论】:

  • 由于这是公认的答案,也许您可​​以解释一下它是如何解决问题的。
猜你喜欢
  • 2017-09-29
  • 1970-01-01
  • 2022-07-06
  • 2019-05-02
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
  • 2015-04-15
相关资源
最近更新 更多