排名指数越高,列表数量越多

时间:2019-06-06 20:42:56

标签: c# android xamarin.android

我有问题。 CoinPriceLayout.RemoveAllViewsInLayout();

int index = 0;
foreach (var coin in coinList)
{                 
    var view = LayoutInflater.Inflate(Resource.Layout.LiveCoinPrice, CoinPriceLayout, false);
    TextView LiveCoinName = view.FindViewById<TextView>(Resource.Id.txtCoinName);
    TextView LiveCoinPrice = view.FindViewById<TextView>(Resource.Id.txtCoinPrice);
    LiveCoinName.Text = coin.Coin;
    LiveCoinPrice.Text = coin.Price.ToString();

    Activity.RunOnUiThread(() =>
    {
        CoinPriceLayout.AddView(view, index);
    });

    index += 1;
}

您不需要了解所有变量,但可以用正确的价格获得3个硬币。然后,我添加一个foreach coin布局以显示在屏幕上,并在更新后删除所有视图并重新构建。现在,此代码第一次正确运行,但是第二次在此行崩溃:

CoinPriceLayout.AddView(view, index);

出现错误:

  

Java.Lang.IndexOutOfBoundsException:index = 3 count = 0

现在唯一的区别是,第二次进入该代码时,它将与后台工作程序一起运行。但是我不明白为什么它第一次正确运行。

我这样运行后台线程:

System.Threading.Timer CoinPrice_Timer = new System.Threading.Timer(new TimerCallback(LoadCoins), null, 1000, 1000);

有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

这是因为您试图在CoinPriceLayout的位置3处添加视图。但是您已经使用RemoveAllViewsInLayout清除了此布局的子级,因此发生索引不足错误,因为没有其他此布局中的视图。索引应为0。

您可以尝试在CoinPriceLayout.AddView(view, index);处创建一个断点并检查索引的值。您忘了将索引值重置为0吗?

更新

您第二次在后台线程调用LoadCoins,因此index += 1;不会等待

Activity.RunOnUiThread(() =>
{
    CoinPriceLayout.AddView(view, index);
});

当您想在索引0处添加视图时,它将直接变为2。这会导致问题。因此,最好将index += 1;放在RunOnUiThread中:

Activity.RunOnUiThread(() =>
{
    CoinPriceLayout.AddView(view, index);
    index++;
});