📅  最后修改于: 2023-12-03 15:38:12.330000             🧑  作者: Mango
在 Android 应用中,有时需要给用户提供搜索功能,以帮助用户快速找到特定的项目。一个常见的场景是在 ListView 中搜索特定的项目,而 EditText 和 TextWatcher 是实现此功能的两个重要组件。本文将介绍如何在 Android 应用中使用 EditText 和 TextWatcher,在 ListView 中搜索项目。
在开始学习如何使用 EditText 和 TextWatcher 进行搜索之前,您需要了解以下内容:
为了在 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,我们将使用它们来实现搜索功能。
在 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
在 getView 方法中,我们使用 simple_list_item_1 布局,该布局包括一个 TextView,我们将它设置为当前项目的文本。
在 filter 方法中,我们清空 filteredItemList,如果搜索文本为空,则将它们添加到 filteredItemList 中。否则,我们将搜索文本转换为小写,并遍历 itemList。如果 itemList 中的项包含搜索文本,则它将添加到 filteredItemList 中。最后,我们调用 notifyDataSetChanged 方法通知 ListView,以更新列表项。
回到 MainActivity 中,我们将在 onCreate 方法中添加 TextWatcher。我们需要声明一个名为 searchView 的 EditText 对象,并将其设置为我们在 activity_main.xml 中定义的 EditText。我们还需要声明一个名为 itemAdapter 的 ItemAdapter 对象,以及一个名为 itemList 的 List
以下是 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 中的项目。使用这个方法,我们可以提供一个强大且灵活的搜索功能,帮助用户更快地找到特定的项目。