【问题标题】:How To Search In Listview From Toolbar In Fragment如何从片段的工具栏中搜索列表视图
【发布时间】:2017-01-04 00:50:49
【问题描述】:

我使用此代码在 ListView 中的 MainActivity 工具栏中进行搜索:

    SearchView searchView;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate( R.menu.main, menu);

    MenuItem myActionMenuItem = menu.findItem( R.id.action_search);
    searchView = (SearchView) myActionMenuItem.getActionView();
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }
        @Override
        public boolean onQueryTextChange(String s) {
            adapter.getFilter().filter(s);
            return false;
        }
    });
    return true;

}

但是现在我将我的 Listview 移动到一个片段中,如何将适配器从片段传递到主要活动?如何更新打字? 有没有比通过适配器更好的方法? 提前谢谢你

【问题讨论】:

    标签: java android android-layout listview android-fragments


    【解决方案1】:

    更好的方法是使用EventBus。这在我们必须将某些数据从 Activity 传递到 Fragment 的场景中非常有用。

    为了使用 EventBus,你需要定义一个 POJO 类,有点像这样:

    class SearchQueryEvent {
        String query;
    
        public SearchQueryEvent(String query) {
            this.query=query;
        }
    
        public String getQuery() {
            return query;
        }
    }
    

    现在,你的代码应该这样修改:

    MainActivity.java

    SearchView searchView;
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate( R.menu.main, menu);
    
        MenuItem myActionMenuItem = menu.findItem( R.id.action_search);
        searchView = (SearchView) myActionMenuItem.getActionView();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }
            @Override
            public boolean onQueryTextChange(String s) {
                EventBus.getDefault().post(new SearchQueryEvent(s));
                return false;
            }
        });
        return true;
    
    }
    

    YourFragment.java

    @Override
    public void onResume() {
        super.onResume();
        EventBus.getDefault().register(this);
    }
    
    @Override
    public void onPause() {
        EventBus.getDefault().unregister(this);
        super.onPause();
    }
    
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onSearchQuery(SearchQueryEvent event) {
        String query=event.getQuery();
        adapter.getFilter().filter(query);
    }
    

    【讨论】:

    • 无法解析符号“EventBus”,我必须导入一些东西吗?
    • 是的,在您的 build.gradle (app) 中添加以下行,所有“编译”语句都在其中写入。 compile 'org.greenrobot:eventbus:3.0.0'
    • 我做到了,但它没有将过滤器应用于适配器,并且在 fragment.java .unsubscribe(this);.subscribe(this); 给我错误“无法解析方法”,我该怎么办?
    • 从不使用片段中的 void onSearchQuery
    • 添加“编译”语句后,您必须构建整个项目以获取引用。重建项目后,您将能够看到 EventBus 类中的方法。
    【解决方案2】:

    试试这个代码,

    activity_main.xml:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="#009688" />
    
        <fragment xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:id="@+id/fragment"
            android:name="ru.lemmaproj.toolbar_search.MainActivityFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:layout="@layout/fragment_main" />
    
    </LinearLayout>
    

    fragment_main.xml:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivityFragment">
    
        <ListView
            android:id="@+id/list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    
    </RelativeLayout>
    

    search_layout.xml:

    <EditText xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:cursorVisible="true"
        android:imeOptions="actionDone"
        android:inputType="text" />
    

    MainActivity.java:

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
        }
    }
    

    MainActivityFragment.java:

    public class MainActivityFragment extends Fragment {
    
        private final String[] items = new String[] { "Android", "iOS", "Windows Phone",
                "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2" };
    
        private ListView listView;
        private ArrayAdapter<String> adapter;
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_main, container, false);
    
            listView = (ListView) view.findViewById(R.id.list);
            adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, items);
            listView.setAdapter(adapter);
    
            return view;
        }
    
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            setHasOptionsMenu(true);
        }
    
        @Override
        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
            super.onCreateOptionsMenu(menu, inflater);
            inflater.inflate(R.menu.menu_fragment, menu);
    
            MenuItem searchItem = menu.findItem(R.id.menu_search);
            SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
            if (searchView != null) {
                searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                    @Override
                    public boolean onQueryTextSubmit(String query) {
                        return true;
                    }
    
                    @Override
                    public boolean onQueryTextChange(String newText) {
                        adapter.getFilter().filter(newText);
                        return true;
                    }
                });
            }
        }
    
    }
    

    【讨论】:

    • 很抱歉,我无法在我的应用程序中使用它。我复制了 fragment.java 的最后一部分(来自 onActivityCreated),并且只更改了布局引用,但是当我尝试运行时它崩溃了
    【解决方案3】:

    1->在fragment中创建静态方法

    public static void doSearch(String query){
        yourAdapter.filter(query);
    }
    

    2-> 在 onQueryTextChange 方法上的活动中调用此方法并传递您要搜索的查询

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.home, menu);
    
        MenuItem myActionMenuItem = menu.findItem(R.id.action_search);
        searchViewShop = (SearchView) myActionMenuItem.getActionView();
        searchViewShop.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return true;
            }
    
            @Override
            public boolean onQueryTextChange(String newText) {
                YourFragment.doSearch(newText);
                return true;
            }
        });
        return true;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      • 2023-04-06
      • 1970-01-01
      • 2017-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多