Xamarin C # - Какой самый быстрый способ обновлять gridview каждую секунду - PullRequest
0 голосов
/ 04 января 2019

У меня проблема.

В моем приложении для Android я использую: Android.Support.V4.View.ViewPager для переключения между сводкой и кошельком.Сводная страница заполнена 3-мя TextViews, а кошелек создан с 1 GridViewОбе страницы заполняются данными из HTTPS-вызова, откуда ответ будет проанализирован в Список.Теперь я хочу обновлять обе страницы каждую секунду.Итак, я попробовал это:

public void LoadOrderPage()
{
    Android.Support.V4.View.ViewPager SummaryWalletSwitcher = FindViewById<Android.Support.V4.View.ViewPager>(Resource.Id.SummaryWalletSwitcher);

    List<View> viewlist = new List<View>();
    viewlist.Add(LayoutInflater.Inflate(Resource.Layout.AgentSummary, null, false));
    viewlist.Add(LayoutInflater.Inflate(Resource.Layout.AgentWallet, null, false));
    SummaryWalletAdapter ViewSwitchAdapter = new SummaryWalletAdapter(viewlist);
    SummaryWalletSwitcher.Adapter = ViewSwitchAdapter;

    Timer AgentInfo_Timer = new Timer();
    AgentInfo_Timer.Interval = 1000;
    AgentInfo_Timer.Elapsed += LoadAgentInfo;
    AgentInfo_Timer.Enabled = true;
}

public void LoadAgentInfo(object sender, ElapsedEventArgs e)
{
    TextView TextPortfolioValue = FindViewById<TextView>(Resource.Id.txtPortfolioValue);
    TextView TextValueUSDT = FindViewById<TextView>(Resource.Id.txtValueUSDT);
    TextView TextTotalValue = FindViewById<TextView>(Resource.Id.txtTotalValue);
    GridView GridviewWallet = FindViewById<GridView>(Resource.Id.GridviewWallet);

    if (FirstWalletRun == true)
    {
        List<wallet> EmptyWalletList = new List<wallet>();
        WalletListAdapter = new WalletListAdapter(this, EmptyWalletList);
        GridviewWallet.Adapter = WalletListAdapter;
        FirstWalletRun = false;
    }

    PortfolioValue = 0;
    ValueUSDT = 0;
    TotalValue = 0;
    string response = "";

    AgentId = getSelectedAgentId();
    if (AgentId == 0)
    {
        AgentId = 1;
    }

    try
    {
        WebClient client = new WebClient();
        var reqparm = new System.Collections.Specialized.NameValueCollection();
        reqparm.Add("agentid", AgentId.ToString());
        reqparm.Add("devicetoken", DeviceToken);
        byte[] responsebytes = client.UploadValues("https://www.test.nl/getagentwallet.php", "POST", reqparm);
        IgnoreBadCertificates();
        response = Encoding.UTF8.GetString(responsebytes);
        response = response.Replace("\n", "").Replace("\t", "");
    }
    catch (Exception ex)
    {

        string exFullName = (ex.GetType().FullName);
        string ExceptionString = (ex.GetBaseException().ToString());

        TextPortfolioValue.Text = "Unknown";
        TextValueUSDT.Text = "Unknown";
        TextTotalValue.Text = "Unknown";
    }

    if (response != "No updates")
    {

        //Parse json content
        var jObject = JObject.Parse(response);

        //Create Array from everything inside Node:"Coins"
        var walletPropery = jObject["Wallet"] as JArray;

        //Create List to save Coin Data
        walletList = new List<wallet>();

        //Find every value in Array: coinPropery
        foreach (var property in walletPropery)
        {
            //Convert every value in Array to string
            var propertyList = JsonConvert.DeserializeObject<List<wallet>>(property.ToString());

            //Add all strings to List
            walletList.AddRange(propertyList);
        }

        //Get all the values from Name, and convert it to an Array
        string[][] NamesArray = walletList.OrderBy(i => i.AgentId)
            .Select(i => new string[] { i.AgentId.ToString(), i.Coin, i.Quantity.ToString(), i.AvgPrice.ToString(), i.Value.ToString() })
            .Distinct()
            .ToArray();

        foreach (string[] str in NamesArray)
        {
            if (str[1] != "USDT")
            {
                PortfolioValue += decimal.Parse(str[4]);
            }
            else
            {
                ValueUSDT += decimal.Parse(str[4]);
            }
        }

        TotalValue = PortfolioValue + ValueUSDT;
        TextPortfolioValue.Text = Math.Round(PortfolioValue, 8).ToString();
        TextValueUSDT.Text = Math.Round(ValueUSDT, 8).ToString();
        TextTotalValue.Text = Math.Round(TotalValue, 8).ToString();

        SortedWalletList = walletList.OrderBy(o => o.Coin).ToList();

        if (WalletListAdapter == null)
        {
            //Fill the DataSource of the ListView with the Array of Names
            WalletListAdapter = new WalletListAdapter(this, SortedWalletList);
            GridviewWallet.Adapter = WalletListAdapter;
        }
        else
        {
            WalletListAdapter.refresh(SortedWalletList);
            AgentInfoNeedsUpdate = true;
        }
    }
    else
    {
        AgentInfoNeedsUpdate = false;
    }
}

И в своем WalletListAdapter я создал функцию обновления:

public void refresh(List<wallet> mItems)
{
    this.mItems = mItems;
    NotifyDataSetChanged();
}

Но GridviewWallet никогда не заполняется или не отображается.Что я делаю неправильно?

РЕДАКТИРОВАТЬ:

Возможно, что-то не так в WalletListAdapter, поэтому вот код класса:

public class WalletListAdapter : BaseAdapter<wallet>
{
    public List<wallet> mItems;
    private Context mContext;

    public WalletListAdapter(Context context, List<wallet> items)
    {
        mItems = items;
        mContext = context;
    }

    public override int Count
    {
        get { return mItems.Count; }
    }

    public void refresh(List<wallet> mItems)
    {
        this.mItems = mItems;
        NotifyDataSetChanged();
    }

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

    public override wallet this[int position]
    {
        get { return mItems[position]; }
    }

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        View row = convertView;

        if (row == null)
        {
            row = LayoutInflater.From(mContext).Inflate(Resource.Layout.walletlist_row, null, false);

            var txtWalletCoin = row.FindViewById<TextView>(Resource.Id.txtWalletCoin);
            var txtWalletQuantity = row.FindViewById<TextView>(Resource.Id.txtWalletQuantity);
            var txtAvgPrice = row.FindViewById<TextView>(Resource.Id.txtWalletAvgPrice);
            var txtWalletValue = row.FindViewById<TextView>(Resource.Id.txtWalletValue);
            var txtProfitUSDT = row.FindViewById<TextView>(Resource.Id.txtWalletProfitUSDT);
            var txtProfitPerc = row.FindViewById<TextView>(Resource.Id.txtWalletProfitPerc);

            row.Tag = new WalletViewHolder()
            {
                txtWalletCoin = txtWalletCoin,
                txtWalletQuantity = txtWalletQuantity,
                txtAvgPrice = txtAvgPrice,
                txtWalletValue = txtWalletValue,
                txtProfitUSDT = txtProfitUSDT,
                txtProfitPerc = txtProfitPerc
            };
        }

        var holder = (WalletViewHolder)row.Tag;

        holder.txtWalletCoin.Text = mItems[position].Coin;
        holder.txtWalletQuantity.Text = Math.Round(mItems[position].Quantity, 2).ToString();
        holder.txtAvgPrice.Text = Math.Round(mItems[position].AvgPrice, 2).ToString();
        holder.txtWalletValue.Text = Math.Round(mItems[position].Value, 2).ToString();

        if (mItems[position].Coin != "USDT")
        {
            holder.txtProfitUSDT.Text = Math.Round(mItems[position].ProfitUSDT, 2).ToString();
            holder.txtProfitPerc.Text = Math.Round(mItems[position].ProfitPerc, 1).ToString();
        }
        else
        {
            holder.txtProfitUSDT.Text = Math.Round(0.00, 2).ToString();
            holder.txtProfitPerc.Text = Math.Round(0.00, 1).ToString();
        }

        return row;
    }
}

1 Ответ

0 голосов
/ 04 января 2019

Надеюсь, что это обсуждение предоставит некоторые идеи, чтобы исправить обновление вида сетки с помощью Xamarin.В соответствии с этим, сетка должна быть воссоздана.https://forums.xamarin.com/discussion/115256/refresh-a-gridview

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...