📜  带有RecyclerView的Android中的SearchView(1)

📅  最后修改于: 2023-12-03 15:09:43.507000             🧑  作者: Mango

带有RecyclerView的Android中的SearchView

在Android应用程序中,经常需要包含搜索功能以便用户可以快速查找相关的信息。本文将介绍如何在Android应用程序中实现带有RecyclerView的SearchView。

SearchView简介

SearchView是Android系统提供的一个用于搜索的控件,可以提供一个可编辑的文本框和一个搜索按钮,支持在输入框中输入关键词后,通过点击或者回车键触发搜索操作。通常情况下,SearchView需要与RecyclerView一起使用来显示搜索结果。

实现步骤

下面将介绍如何在Android应用程序中实现带有RecyclerView的SearchView,具体步骤如下:

步骤1:添加依赖

在项目的build.gradle文件中添加以下依赖:

dependencies {
    implementation 'com.android.support:recyclerview-v7:27.1.1'
    implementation 'com.android.support:appcompat-v7:27.1.1'
}
步骤2:创建布局文件

在布局文件中添加SearchView和RecyclerView,如下所示:

<android.support.v7.widget.Toolbar
    android:id="@+id/search_toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary">

    <SearchView
        android:id="@+id/search_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:iconifiedByDefault="false"
        android:queryHint="Search"
        app:queryBackground="@null"
        app:defaultQueryHint="Search"/>

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

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

这里使用的是Toolbar作为搜索栏,方便进行自定义和美化。

步骤3:创建适配器

创建一个适配器,用于将搜索结果绑定到RecyclerView上。适配器通常需要继承RecyclerView.Adapter类,并重写onCreateViewHolder()、onBindViewHolder()、getItemCount()方法,具体实现如下:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private ArrayList<String> mSearchList;

    public MyAdapter(ArrayList<String> searchList) {
        mSearchList = searchList;
    }

    //创建ViewHolder
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_layout, parent, false);
        return new ViewHolder(view);
    }

    //填充数据
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.mTextView.setText(mSearchList.get(position));
    }

    //获取数据数量
    @Override
    public int getItemCount() {
        return mSearchList.size();
    }

    //ViewHolder
    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView mTextView;
        public ViewHolder(View itemView) {
            super(itemView);
            mTextView = itemView.findViewById(R.id.text_view);
        }
    }
}

这里使用了ArrayList来存储搜索结果,每个搜索结果使用TextView和自定义的item_layout布局进行显示。

步骤4:实现搜索功能

在Activity中实现搜索功能,具体实现如下:

public class MainActivity extends AppCompatActivity {

    private SearchView mSearchView;
    private RecyclerView mRecyclerView;
    private MyAdapter mAdapter;
    private ArrayList<String> mResultList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化SearchView和RecyclerView
        Toolbar toolbar = findViewById(R.id.search_toolbar);
        mSearchView = toolbar.findViewById(R.id.search_view);
        mRecyclerView = findViewById(R.id.recycler_view);

        //设置RecyclerView的布局管理器
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(layoutManager);

        //设置RecyclerView的适配器
        mAdapter = new MyAdapter(mResultList);
        mRecyclerView.setAdapter(mAdapter);

        //设置SearchView的监听器
        mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                //搜索操作
                mResultList.clear();
                //添加搜索结果
                for (String s : getStringList()) {
                    if (s.contains(query)) {
                        mResultList.add(s);
                    }
                }
                //通知适配器更新搜索结果
                mAdapter.notifyDataSetChanged();

                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                //搜索框内容改变操作(可选)
                return false;
            }
        });

    }

    //返回搜索数据
    private ArrayList<String> getStringList() {
        ArrayList<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");
        list.add("Durian");
        list.add("Elderberry");
        list.add("Fig");
        list.add("Grapes");
        list.add("Honeydew");
        list.add("Jackfruit");
        list.add("Kiwi");
        list.add("Lemon");
        list.add("Mango");
        list.add("Nectarine");
        list.add("Orange");
        list.add("Pear");
        list.add("Quince");
        list.add("Raspberry");
        list.add("Strawberry");
        list.add("Tomato");
        list.add("Ugli fruit");
        list.add("Vineland apple");
        list.add("Watermelon");
        list.add("Xigua");
        list.add("Yellow passion fruit");
        list.add("Zucchini");
        return list;
    }
}

这里使用了SearchView的setOnQueryTextListener()来监听搜索操作,当用户输入查询字符串并提交时,会执行搜索操作,将搜索结果添加到mResultList中并通知适配器更新RecyclerView的显示结果。

总结

本文介绍了如何在Android应用程序中实现带有RecyclerView的SearchView,让用户可以方便地对数据进行搜索操作。SearchView具有良好的兼容性和灵活性,可通过自定义进行进一步的优化和美化。