如何防止文本键入时android SearchView查询切换

如何防止文本键入时android SearchView查询切换,android,xamarin,mvvmcross,searchview,Android,Xamarin,Mvvmcross,Searchview,我通过SearchView组件获得了我的视图。问题是输入字段中的每个新符号都会切换查询操作,因此有一些http请求被触发等,因此它开始工作缓慢 我想它只运行后,我点击虚拟键盘上的搜索按钮贝娄按钮 在SearchView中是否有该属性 布局代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

我通过SearchView组件获得了我的视图。问题是输入字段中的每个新符号都会切换查询操作,因此有一些http请求被触发等,因此它开始工作缓慢

我想它只运行后,我点击虚拟键盘上的搜索按钮贝娄按钮

在SearchView中是否有该属性

布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:local="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <SearchView
        android:id="@+id/search"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:clickable="true"
        local:MvxBind="Query SearchString"
        />

    <MvvmCross.Binding.Droid.Views.MvxListView
        android:id="@+id/searchlist"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        local:MvxBind="ItemsSource FoundItems"
        local:MvxItemTemplate="@layout/listitem"/>


</LinearLayout>
或者我应该做一些像自定义绑定这样的东西来检测键盘键的点击

UPD:

一些代码可以明确部分搜索工作原理:

视图模型

public class RemoteMusicSearchViewModel : MvxViewModel
    {
        private IMvxNavigationService _mvxNavigationService;
        private IRemoteMusicDataService _remoteMusicDataService;
        private int _currentPage;

        public RemoteMusicSearchViewModel(IMvxNavigationService mvxNavigationService,
            IRemoteMusicDataService remoteMusicDataService)
        {
            _mvxNavigationService = mvxNavigationService;
            _remoteMusicDataService = remoteMusicDataService;
        }

        public override void Start()
        {
            base.Start();

            _currentPage = 0;
        }

        private string _searchString;

        public string SearchString
        {
            get { return _searchString; }

            set
            {
                _searchString = value;
                RaisePropertyChanged(() => SearchString);
                PerformBasicSearch().ConfigureAwait(false);
            }
        }

        private ObservableCollection<DownloadableEntity> _foundItems;

        public ObservableCollection<DownloadableEntity> FoundItems
        {
            get { return _foundItems; }

            set
            {
                if (_currentPage > 0)
                {
                    _foundItems = new ObservableCollection<DownloadableEntity>(_foundItems.Concat(value));
                }
                else
                {
                    _foundItems = value;
                }

                RaisePropertyChanged(() => FoundItems);
            }
        }

        private async Task PerformBasicSearch(int page = 0)
        {
            string request = SearchString;
            string result = await _remoteMusicDataService.SearchByProperty(request, MusicSearchType.ByTracks, page).ConfigureAwait(false);
            var searchResult = MusicSearchResult.FromJson(result);

            await PrepareDataForOutput(searchResult).ConfigureAwait(false);
        }
    }
完整布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:local="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <SearchView
        android:id="@+id/search"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:clickable="true"
        local:MvxBind="Query SearchString"
        />

    <MvvmCross.Binding.Droid.Views.MvxListView
        android:id="@+id/searchlist"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        local:MvxBind="ItemsSource FoundItems"
        local:MvxItemTemplate="@layout/listitem"/>


</LinearLayout>

我猜你是在为这个问题寻找手动解决方案

例如,对于您获得的每个关键事件,您可以在特定阈值500毫秒后触发延迟操作

可能使用Handler.postdayed

然后有三种情况

另一个事件在激发之前出现,因此您调用Handler.removeCallbacks并激发另一个延迟操作 另一个事件发生在请求已被触发但尚未得到结果时,因此您取消请求并触发延迟操作。 事件发生时没有延迟操作挂起或请求挂起,因此您只需触发延迟操作。
但是,如果您愿意使用任何反应式变体,则有更复杂的解决方案,基本上是通过消除键盘笔划事件的抖动来实现的。

我找到了解决方案-我刚刚为此创建了新的绑定:

public class SearchViewKeyPressEventsBinding : MvxAndroidTargetBinding
    {
        private readonly SearchView _searchView;
        private IMvxAsyncCommand _command;

        public SearchViewKeyPressEventsBinding(SearchView searchView) : base(searchView)
        {
            _searchView = searchView;
            _searchView.QueryTextSubmit += _searchView_KeyPress;
        }

        private void _searchView_KeyPress(object sender, SearchView.QueryTextSubmitEventArgs e)
        {
            try
            {
                if (_command != null)
                {
                    _command.ExecuteAsync();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public override Type TargetType
        {
            get { return typeof(IMvxAsyncCommand); }
        }


        protected override void SetValueImpl(object target, object value)
        {
            try
            {
                _command = (IMvxAsyncCommand)value;
            }
            catch (Exception e)
            {
                Log.Error("SOME BINDER FAIL\n\t" + e.Message + "\n", "SOME BINDER FAIL\n\t" + e.Message + "\n");
                throw;
            }
        }

        protected override void Dispose(bool isDisposing)
        {
            if (isDisposing)
            {
                _searchView.QueryTextSubmit -= _searchView_KeyPress;
            }
            base.Dispose(isDisposing);
        }
    }
}
然后注册它,它就工作了:

   registry.RegisterFactory(new MvxCustomBindingFactory<SearchView>("OnSearchSubmit", (sv) => new SearchViewKeyPressEventsBinding(sv)))

你正在生成一个请求的部分在哪里?@azizbekian我会更新问题的。我只是想在按下按钮之前阻止运行查询
<SearchView
        android:id="@+id/search10"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:clickable="true"
        local:MvxBind="Query SearchString; OnSearchSubmit OnSubmitPressCommand" />
 public IMvxAsyncCommand OnSubmitPressCommand
        {
            get
            {
                return new MvxAsyncCommand(OnSearchSubmit);
            }
        }

  private async Task OnSearchSubmit()
        {
            //HideKeyboardOnSearchStart.Invoke(this, null);
            await PerformBasicSearch().ConfigureAwait(false);
        }