移动Listview位置,同时使用texttospeech进行拼写

时间:2016-07-05 08:36:01

标签: android xamarin

我有一个ListView,我让我按位置读取位置。 我想滚动到实际上正在阅读的列表位置。

当我开始我的读取方法时,位置立即跳转到最后一个列表位置,bcs tts创建一个语音队列异步然后播放它。

有没有办法同步移动listposition?

  _btnspeak.Click += delegate {

            //vokabeln is a List of Vokabel
            if (vokabeln.Count > 0)
            {
                // _listpos is the current position in the list
                int _listpos = 0;


                while (_listpos < vokabeln.Count)

                {
                    Vokabel v = vokabeln.ElementAt(_listpos);

                    _lvvokabeln.SmoothScrollToPosition(_listpos);


                    textToSpeechd.Speak(v.DE, QueueMode.Add, null);
                    textToSpeechd.PlaySilence(200, QueueMode.Add, null);


                    _listpos += 1;

                }
            }
        };

2 个答案:

答案 0 :(得分:1)

如果我理解,你只想在读取列表项时滚动,所以你需要等到读取该项目才能阅读下一个项目。

关于你的问题:

  

有没有办法同步移动listposition?

正是你正在做的事情,while循环一直运行到最后(同步),这就是它向下滚动到最后位置的原因。

你需要异步制作它:

b.Click += async delegate { // make the delate async
    if(vokabeln.Count > 0)
    {
        while(_listpos < vokabeln.Count)
        {
            // do scroll
            // do speech

            // set here the duration of the speech. 1000 = 1 second
            await Task.Delay(3000); 
        }
    }
};

我不知道TextToSpeech API,但最好的情况是,如果你能得到特定演讲的持续时间,那么await Task.Delay(duration)就像上面的例子一样。

如果您没有该选项,但API会在语音完成/结束时提供事件,而不是while循环,您可以执行以下操作:

  1. 将计数器设为0
  2. 滚动到第一项
  3. 做第一项的演讲
  4. 听完演讲结束
  5. counter ++
  6. if counter&lt; = total items =&gt;对下一个做同样的事情

答案 1 :(得分:0)

你可以使用getListView().smoothScrollToPosition(position); 将列表视图滚动到当前位置