Android 中使用 ArrayAdapter 进行自定义过滤

作者:编程家 分类: android 时间:2025-04-27

使用 ArrayAdapter 进行自定义过滤是 Android 开发中常见的需求之一。ArrayAdapter 是 Android 提供的一个适配器类,用于将数据源与界面进行绑定。在某些情况下,我们可能需要对数据源进行自定义过滤,以便根据用户的输入来动态显示匹配的结果。本文将介绍如何在 Android 中使用 ArrayAdapter 进行自定义过滤,并提供一个案例代码来演示。

案例代码:自定义过滤的 ArrayAdapter

首先,我们需要创建一个自定义的 ArrayAdapter 类,继承自 ArrayAdapter。在该类中,我们需要重写两个方法:getFilter() 和 convertResultToString()。

java

public class CustomArrayAdapter extends ArrayAdapter implements Filterable {

private ArrayList mData;

private ArrayList mFilteredData;

public CustomArrayAdapter(Context context, int resource, ArrayList data) {

super(context, resource, data);

mData = data;

mFilteredData = new ArrayList<>(data);

}

@Override

public Filter getFilter() {

return new Filter() {

@Override

protected FilterResults performFiltering(CharSequence constraint) {

FilterResults results = new FilterResults();

ArrayList filteredList = new ArrayList<>();

if (constraint == null || constraint.length() == 0) {

filteredList.addAll(mData);

} else {

String filterPattern = constraint.toString().toLowerCase().trim();

for (String item : mData) {

if (item.toLowerCase().contains(filterPattern)) {

filteredList.add(item);

}

}

}

results.values = filteredList;

results.count = filteredList.size();

return results;

}

@Override

protected void publishResults(CharSequence constraint, FilterResults results) {

mFilteredData.clear();

mFilteredData.addAll((ArrayList) results.values);

notifyDataSetChanged();

}

};

}

@Override

public String convertResultToString(Object resultValue) {

return (String) resultValue;

}

@Override

public int getCount() {

return mFilteredData.size();

}

@Override

public String getItem(int position) {

return mFilteredData.get(position);

}

}

在上述代码中,我们通过继承 ArrayAdapter,并实现 Filterable 接口来创建一个自定义的 ArrayAdapter。在 getFilter() 方法中,我们定义了数据源的过滤逻辑。根据用户的输入 constraint,我们遍历数据源 mData,并将匹配的结果添加到过滤后的数据源 filteredList 中。然后,在 publishResults() 方法中,我们更新过滤后的数据源 mFilteredData,并通知适配器数据已改变,以便界面能够重新显示匹配的结果。

使用自定义过滤的 ArrayAdapter

接下来,我们将演示如何使用自定义过滤的 ArrayAdapter。假设我们有一个包含城市名的数据源,我们希望能够根据用户的输入来过滤显示匹配的城市名。

首先,我们在布局文件中添加一个 AutoCompleteTextView,用于接收用户的输入。

xml

android:id="@+id/autoCompleteTextView"

android:layout_width="match_parent"

android:layout_height="wrap_content"/>

然后,在 MainActivity 中,我们初始化数据源和 ArrayAdapter,并将 ArrayAdapter 设置给 AutoCompleteTextView。

java

public class MainActivity extends AppCompatActivity {

private AutoCompleteTextView mAutoCompleteTextView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

ArrayList cities = new ArrayList<>();

cities.add("北京");

cities.add("上海");

cities.add("广州");

cities.add("深圳");

cities.add("杭州");

CustomArrayAdapter adapter = new CustomArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, cities);

mAutoCompleteTextView = findViewById(R.id.autoCompleteTextView);

mAutoCompleteTextView.setAdapter(adapter);

}

}

在上述代码中,我们创建了一个包含城市名的 ArrayList,并将其作为数据源传递给了 CustomArrayAdapter。然后,我们将 CustomArrayAdapter 设置给 AutoCompleteTextView,这样用户输入的内容就会被自动过滤并显示匹配的结果。

通过自定义过滤的 ArrayAdapter,我们可以轻松实现根据用户输入来动态过滤和显示匹配的结果。本文介绍了如何创建一个自定义过滤的 ArrayAdapter,以及如何在 Android 中使用它。通过这个案例代码,希望能够帮助读者更好地理解和应用 ArrayAdapter 的自定义过滤功能。