📜  如何在 Android 中使用 EditText 和 TextWatcher 在 ListView 中搜索项目?(1)

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

在 Android 中使用 EditText 和 TextWatcher 在 ListView 中搜索项目

在 Android 应用中,有时需要给用户提供搜索功能,以帮助用户快速找到特定的项目。一个常见的场景是在 ListView 中搜索特定的项目,而 EditText 和 TextWatcher 是实现此功能的两个重要组件。本文将介绍如何在 Android 应用中使用 EditText 和 TextWatcher,在 ListView 中搜索项目。

前置知识

在开始学习如何使用 EditText 和 TextWatcher 进行搜索之前,您需要了解以下内容:

  • Android 应用的基础知识,包括 Activity 和布局等概念。
  • ListView 的基础知识,包括如何创建 ListView、如何使用 Adapter 和如何处理 ListView 的点击事件等。
实现步骤

为了在 ListView 中搜索项目,需要执行以下步骤:

  1. 创建一个布局文件,包含一个 EditText 和一个 ListView。
  2. 创建一个 Adapter,用于将数据加载到 ListView 中。
  3. 添加 TextWatcher,以便在用户输入时过滤 ListView 中的项目。
  4. 在 TextWatcher 的 onTextChanged 方法中,使用 Adapter 过滤器过滤 ListView 中的项目。

下面是实现这些步骤的详细指南。

步骤一:创建布局文件

在 res/layout 文件夹中创建一个名为 activity_main.xml 的文件,将以下代码添加到其中:

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

    <EditText
        android:id="@+id/et_search"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Search"/>

    <ListView
        android:id="@+id/lv_items"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

这个布局文件包含一个 EditText 和一个 ListView,我们将使用它们来实现搜索功能。

步骤二:创建 Adapter

在 MainActivity 中创建一个名为 ItemAdapter 的类,继承自 BaseAdapter,并实现以下方法:

public class ItemAdapter extends BaseAdapter {

    private Context context;
    private List<String> itemList;
    private List<String> filteredItemList;

    public ItemAdapter(Context context, List<String> itemList) {
        this.context = context;
        this.itemList = itemList;
        filteredItemList = new ArrayList<>(itemList);
    }

    @Override
    public int getCount() {
        return filteredItemList.size();
    }

    @Override
    public Object getItem(int position) {
        return filteredItemList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(android.R.layout.simple_list_item_1, parent, false);
        }
        TextView textView = convertView.findViewById(android.R.id.text1);
        textView.setText(filteredItemList.get(position));
        return convertView;
    }

    public void filter(String text) {
        filteredItemList.clear();
        if (TextUtils.isEmpty(text)) {
            filteredItemList.addAll(itemList);
        } else {
            text = text.toLowerCase();
            for (String item : itemList) {
                if (item.toLowerCase().contains(text)) {
                    filteredItemList.add(item);
                }
            }
        }
        notifyDataSetChanged();
    }
}

该 Adapter 接受一个 List 对象作为其数据源。itemList 变量包含应在 ListView 中显示的所有项目,而 filteredItemList 则包含应在搜索时显示的项目。在 ItemAdapter 的构造方法中,我们使用 ArrayList 对 itemList 进行初始化,并使用 filteredItemList 复制 itemList。

在 getView 方法中,我们使用 simple_list_item_1 布局,该布局包括一个 TextView,我们将它设置为当前项目的文本。

在 filter 方法中,我们清空 filteredItemList,如果搜索文本为空,则将它们添加到 filteredItemList 中。否则,我们将搜索文本转换为小写,并遍历 itemList。如果 itemList 中的项包含搜索文本,则它将添加到 filteredItemList 中。最后,我们调用 notifyDataSetChanged 方法通知 ListView,以更新列表项。

步骤三:添加 TextWatcher

回到 MainActivity 中,我们将在 onCreate 方法中添加 TextWatcher。我们需要声明一个名为 searchView 的 EditText 对象,并将其设置为我们在 activity_main.xml 中定义的 EditText。我们还需要声明一个名为 itemAdapter 的 ItemAdapter 对象,以及一个名为 itemList 的 List 对象,以填充 Adapter。

以下是 onCreate 方法的完整代码:

public class MainActivity extends AppCompatActivity {

    private EditText searchView;
    private ListView listView;
    private ItemAdapter itemAdapter;
    private List<String> itemList;

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

        searchView = findViewById(R.id.et_search);
        listView = findViewById(R.id.lv_items);

        itemList = new ArrayList<>();
        itemList.add("Apple");
        itemList.add("Banana");
        itemList.add("Cherry");
        itemList.add("Durian");

        itemAdapter = new ItemAdapter(this, itemList);
        listView.setAdapter(itemAdapter);

        searchView.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                itemAdapter.filter(s.toString());
            }

            @Override
            public void afterTextChanged(Editable s) {
            }
        });
    }
}

我们首先在 onCreate 方法中获取 EditText 和 ListView 的引用,并将 itemList 添加到 Adapter 中。然后,我们添加一个 TextWatcher,它将在用户输入时响应,并使用 filter 方法过滤 ListView 中的项目。

在 onTextChanged 方法中,我们获取用户输入的新文本,并将其传递给 itemAdapter 的 filter 方法。在 filter 方法中,我们使用输入的文本来过滤 itemList,并将过滤结果添加到 filteredItemList 中。最后,我们调用 notifyDataSetChanged 方法通知 ListView,以更新列表项。

总结

本文介绍了如何在 Android 应用中使用 EditText 和 TextWatcher,在 ListView 中搜索项目。我们创建了一个包含 EditText 和 ListView 的布局文件,并使用 ItemAdapter 将数据加载到 ListView 中。然后,我们添加了一个 TextWatcher,在用户输入时过滤 ListView 中的项目。使用这个方法,我们可以提供一个强大且灵活的搜索功能,帮助用户更快地找到特定的项目。