Android MvxAutoCompleteTextView下拉列表在每次按键时都会重新打开
我有一个问题,用户每次按一次键,AutoCompleteTextView就会快速隐藏并再次显示(带有一组更新的值) 请建议我的问题可能在哪里,以及您是否看到以下代码存在任何其他问题 视图中的绑定:Android MvxAutoCompleteTextView下拉列表在每次按键时都会重新打开,android,xamarin,mvvmcross,autocompletetextview,Android,Xamarin,Mvvmcross,Autocompletetextview,我有一个问题,用户每次按一次键,AutoCompleteTextView就会快速隐藏并再次显示(带有一组更新的值) 请建议我的问题可能在哪里,以及您是否看到以下代码存在任何其他问题 视图中的绑定: bindingSet .Bind(emailAutoCompleteTextView) .For(t => t.Text) .To(vm => vm.Email); bindingSet .Bind(emailAutoCompleteTextView)
bindingSet
.Bind(emailAutoCompleteTextView)
.For(t => t.Text)
.To(vm => vm.Email);
bindingSet
.Bind(emailAutoCompleteTextView)
.For(t => t.PartialText)
.To(vm => vm.CurrentEmailEntry);
bindingSet
.Bind(emailAutoCompleteTextView)
.For(t => t.ItemsSource)
.To(vm => vm.CurrentEmailAutoCompleteSuggestions);
AXML布局:
<mvvmcross.droid.support.v7.appcompat.widget.MvxAppCompatAutoCompleteTextView
android:id="@+id/EmailAutoCompleteTextView"
android:layout_marginTop="@dimen/PaddingBetweenUserInputFields"
android:completionThreshold="1"
android:inputType="textEmailAddress" />
查看模型代码:
private string _currentEmailEntry;
public string CurrentEmailEntry
{
get
{
return _currentEmailEntry;
}
set
{
_currentEmailEntry = value;
if (value == string.Empty)
{
_currentEmailEntry = null;
}
CurrentEmailAutoCompleteSuggestions = _emailAutoCompleteList
.Where(email => email.StartsWith(_currentEmailEntry, StringComparison.OrdinalIgnoreCase))
.ToArray();
RaisePropertyChanged(nameof(CurrentEmailEntry));
}
}
private static readonly string[] _emailAutoCompleteList = {"Gordon", "Gordy", "Go", "Freeman", "Is", "Alive"};
private IList<string> _currentEmailAutoCompleteSuggestions = _emailAutoCompleteList.ToList();
public IList<string> CurrentEmailAutoCompleteSuggestions
{
get { return _currentEmailAutoCompleteSuggestions; }
set
{
if (ReferenceEquals(_currentEmailAutoCompleteSuggestions, value))
return;
_currentEmailAutoCompleteSuggestions = value;
RaisePropertyChanged(nameof(CurrentEmailAutoCompleteSuggestions));
}
}
private string\u currentEmailEntry;
公共字符串CurrentEmailEntry
{
得到
{
返回当前电子邮件条目;
}
设置
{
_currentEmailEntry=值;
if(值==string.Empty)
{
_currentEmailEntry=null;
}
CurrentEmailAutoCompleteSuggestions=\u emailAutoCompleteList
.Where(email=>email.StartsWith(_currentEmailEntry,StringComparison.OrdinalIgnoreCase))
.ToArray();
RaisePropertyChanged(名称(CurrentEmailEntry));
}
}
私有静态只读字符串[]\u emailAutoCompleteList={“Gordon”、“Gordy”、“Go”、“Freeman”、“Is”、“Alive”};
private IList_currentEmailAutoCompleteSuggestions=_emailAutoCompleteList.ToList();
公共IList当前电子邮件自动完成建议
{
获取{return\u currentEmailAutoCompleteSuggestions;}
设置
{
if(ReferenceEquals(_currentEmailAutoCompleteSuggestions,value))
返回;
_currentEmailAutoCompleteSuggestions=值;
RaisePropertyChanged(名称(CurrentEmailAutoCompleteSuggestions));
}
}
我使用MvvmCross 4.0(升级不是选项)
注意:我尝试使用
ObservableCollection
而不是IList
并删除/添加项目(不重新分配集合本身),但在此之后,CurrentEmailEntry
的setter在用户在文本视图中键入第一个字符后停止接收值。MvxFilteringAdapter
中的代码似乎在等待重置事件时卡住了。因为这里或MvvmCross Xamarin Slack通道上都没有人应答,我最终自己找到了解决方案
正是重新创建了绑定到ItemsSource
的列表,才导致了这种奇怪的行为
使用Clear()/Add()
而不是重新创建的observateCollection
确实是一条路。上一个问题段落中描述的卡住行为(等待重置事件)是由于没有正确的线程调度(我的应用程序是多线程的)造成的
当我用总是在UI线程上引发CollectionChanged
事件的代理集合包装我的可观察集合时,问题就消失了
为了子孙后代的利益,我把这个问题留在这里。因为在这里或MvvmCross Xamarin Slack频道上都没有人回答,我最终自己找到了解决方案 正是重新创建了绑定到
ItemsSource
的列表,才导致了这种奇怪的行为
使用Clear()/Add()
而不是重新创建的observateCollection
确实是一条路。上一个问题段落中描述的卡住行为(等待重置事件)是由于没有正确的线程调度(我的应用程序是多线程的)造成的
当我用总是在UI线程上引发CollectionChanged
事件的代理集合包装我的可观察集合时,问题就消失了
为了子孙后代的利益,把这些留在这里