【问题标题】:SearchView in activity toolbar and filter to fragment活动工具栏中的 SearchView 并过滤到片段
【发布时间】:2019-09-04 11:15:13
【问题描述】:

我已经使用自定义工具栏在活动中提供 SearchView,并且过滤器数据进入片段。当我点击搜索图标时,工具栏的大小会增加。该活动中使用了导航栏,可能是问题吗? 它正在使用没有导航栏的单独活动。vb

这是我的代码: Activity.xml:

<android.support.design.widget.AppBarLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:elevation="5dp">

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    style="@style/Toolbar"
    app:contentInsetEnd="5dp"
    app:contentInsetLeft="15dp"
    app:contentInsetRight="5dp"
    app:contentInsetStart="15dp"
    app:theme="@style/AppTheme.Toolbar"
    app:popupTheme="@style/AppTheme.PopupOverlay"
    app:contentInsetStartWithNavigation="15dp"
    app:titleTextColor="@color/colorWhite"
    tools:targetApi="lollipop">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/toolbar_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_centerInParent="true"
            android:layout_gravity="start"
            android:gravity="center"
            android:text=""
            android:textAllCaps="false"
            android:textColor="@color/colorWhite"
            android:textSize="16sp"
            android:textStyle="bold"
            tools:ignore="RelativeOverlap" />


        <TextView
            android:id="@+id/toolbar_student_details"
            android:layout_width="120dp"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_alignParentRight="true"
            android:layout_gravity="end"
            android:gravity="center"
            android:text=""
            android:textAllCaps="false"
            android:textColor="@color/colorWhite"
            android:textSize="16sp"
            tools:ignore="RelativeOverlap" />

        <Spinner
            android:id="@+id/toolbar_student_details_spinner"
            android:spinnerMode="dropdown"
            android:layout_width="120dp"
            android:backgroundTint="@color/colorWhite"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_alignParentRight="true"
            android:layout_gravity="end"
            android:textAllCaps="false"
            android:textColor="@color/colorWhite"
            android:textSize="16sp"
            tools:ignore="RelativeOverlap"
            android:visibility="gone"
            >
        </Spinner>

        <ImageView
            android:id="@+id/admin_image"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_alignParentEnd="true"
            android:layout_alignParentRight="true"
            android:layout_marginEnd="10dp"
            android:layout_marginRight="10dp"
            android:contentDescription="@string/app_name"
            android:visibility="gone" />
    </RelativeLayout>


</android.support.v7.widget.Toolbar>

    </android.support.design.widget.AppBarLayout>

片段代码:

   @Override
   public View onCreateView(@NonNull LayoutInflater inflater, 
 ViewGroup 
container, Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View rootView= 
       inflater.inflate(R.layout.fragment_staff_fragment_admin, 
            container, false);
    setHasOptionsMenu(true);
    ButterKnife.bind(this, rootView);
    return rootView;
}

    @Override
   public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

    getBaseActivity().getMenuInflater().inflate(R.menu.menu_main, 
     menu);
    SearchView searchView;
    // Associate searchable configuration with the SearchView
    SearchManager searchManager = (SearchManager)getBaseActivity(). 
   getSystemService(Context.SEARCH_SERVICE);
    searchView = (SearchView) menu.findItem(R.id.action_search)
            .getActionView();
    assert searchManager != null;
    searchView.setSearchableInfo(searchManager
            .getSearchableInfo(getBaseActivity().getComponentName()));
    searchView.setMaxWidth(Integer.MAX_VALUE);

    // listening to search query text change
    searchView.setOnQueryTextListener(new 
     SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            // filter recycler view when query submitted
            mAdapter.getFilter().filter(query);
            return false;
        }

        @Override
        public boolean onQueryTextChange(String query) {
            // filter recycler view when text is changed
            mAdapter.getFilter().filter(query);
            return false;
        }
    });
 }

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_search) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

【问题讨论】:

    标签: android android-fragments searchview


    【解决方案1】:

    您应该听取Activity 中的更改并将结果发送到您的Fragment,因为您的SearchViewActivity 内(在自定义Toolbar 中)。您可能面临的问题之一是调用时 searchview 为空。

    如果您使用 Android 架构组件MVVM 模式,我建议您通过您的 ViewModel 执行此操作,如下所示:

    1. 聆听活动的变化
    // listening to search query text change
        searchView.setOnQueryTextListener(new 
         SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                //filter the data in step 2
                return false;
            }
    
            @Override
            public boolean onQueryTextChange(String query) {
                // filter data in step 2
                return false;
            }
        });
    
    1. 将查询发送到您的 ViewModel 函数以过滤数据

    在您的活动中:

            ...
            @Override
            public boolean onQueryTextSubmit(String query) {
                //filter the data
                viewModel.filterData(query);
                return false;
            }
            ...
    

    在您的 ViewModel 中:

           public List<String> listOfData = getListOfData();
           public LiveData<List<String>> searchResults = new MutableLiveData(listOfData);
    
           // filter list of data when query submitted
           public void filterData(String query) {
                //filter outside of your RecyclerView Adapter through your listOfData variable
                searchResults.value = getFilter().filter(query);
           }
    
           public LiveData<List<String>> getSearchResults() {
                return searchResults;
           }
    

    通过在你的LiveDatasearchResults.value上设置结果,你可以直接从你的Fragment听到它的变化,从而完成你的Activity和你的FragmentRecyclerView之间的通信通过这个变量在第三步。

    1. 观察Fragment 中的ViewModel 变量并更新适配器

    在您的 Fragment 中

            override fun onActivityCreated(savedInstanceState: Bundle?) {
                super.onActivityCreated(savedInstanceState)
    
    
                viewModel.getSearchResults().observe(this, { searchResults->
                    Log.w("onActivityCreated()", "new search list received :" +searchResults)
                    mAdapter.updateList(searchResults)
                    listItemsAdapter.notifyDataSetChanged()
                });
    
        }
    

    通过这些更改,您将从 Activity SearchView 过滤并将结果发送到应该可以工作的 Fragment RecyclerView。如果您使用的是另一种模式,重要的是将查询从您的Activity 发送到您的Fragment,而不是仅在您的Fragment 中收听。

    如果您还没有使用这些,我建议您看看带有 MVVMAAC。您可以在Android Developers Documentation 中找到有关这些概念的更多信息。

    希望这有帮助,祝你好运。

    【讨论】:

    • 过滤不是问题。它正在工作。 Onclick 的搜索图标工具栏大小增加。明智的做法是不好。
    • 我已经添加了截图。请检查
    • 您是否收到onQueryTextChange 的查询?如果是这样,并且如果过滤正常,那么您的适配器可能有问题。否则,您的问题可能出在获取查询参数的方式上。
    • 到目前为止工作正常。你能告诉我为什么工具栏的大小会增加吗?
    • 据我猜测,当SearchView 打开时,您的工具栏中的项目可能会被推送并为工具栏创建额外的高度。
    猜你喜欢
    • 2019-04-24
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 2016-11-20
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    相关资源
    最近更新 更多