一:布局文件
<EditText
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="false"/>
二:自定义对话框的布局文件search.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<SearchView
android:id="@+id/searchView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:iconifiedByDefault="false"
android:queryHint="姓名"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:padding="10dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="姓名:"
android:layout_weight="1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="编号:"
android:layout_weight="1"/>
</LinearLayout>
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
三:自定义ListView适配器的布局文件search_list.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:padding="10dp">
<TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<TextView
android:id="@+id/number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"/>
</LinearLayout>
四:自定义ListView适配器SearchAdapter
package com.example.test.tools;
import android.content.Context;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;
import com.example.test.R;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class SearchAdapter extends BaseAdapter implements Filterable {
private Context context;
private List<Map> list1; // 备份原始数据
private List<Map> list2;
MyFilter filter;
List<Map> list;
public SearchAdapter(Context context, List<Map> lists) {
this.context = context;
this.list1 = lists;
list2 = lists;
}
@Override
public int getCount() {
return list1.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.search_list, null);
holder = new ViewHolder();
holder.name = convertView.findViewById(R.id.name);
holder.number = convertView.findViewById(R.id.number);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.name.setText(list1.get(position).get("name").toString());
holder.number.setText(list1.get(position).get("number").toString());
return convertView;
}
@Override
public Filter getFilter() {
if (filter == null) {
filter = new MyFilter();
}
return filter;
}
class MyFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if (TextUtils.isEmpty(constraint)) {
list = list2;
} else {
list = new ArrayList<>();
for (Map m : list2) {
if (m.get("name").toString().contains(constraint)) {
list.add(m);
}
}
}
results.values = list;
results.count = list.size();
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
list1 = (List<Map>) results.values;
if (results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
}
public List<Map> getList() {
return list;
}
class ViewHolder {
TextView name;
TextView number;
}
}
五:调用
boolean content = false;
List<Map> list = new ArrayList<>();
Map map1 = new HashMap();
map1.put("name", "张三");
map1.put("age", "18");
map1.put("gender", "男");
map1.put("number", "001");
list.add(map1);
Map map2 = new HashMap();
map2.put("name", "翠花");
map2.put("age", "16");
map2.put("gender", "女");
map2.put("number", "002");
list.add(map2);
Map map3 = new HashMap();
map3.put("name", "李四");
map3.put("age", "20");
map3.put("gender", "男");
map3.put("number", "003");
list.add(map3);
Map map4 = new HashMap();
map4.put("name", "熊大");
map4.put("age", "32");
map4.put("gender", "男");
map4.put("number", "004");
list.add(map4);
EditText edit = findViewById(R.id.edit);
edit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LayoutInflater inflater = (LayoutInflater) Activity4.this.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.search, null);
SearchView searchView = layout.findViewById(R.id.searchView);
ListView listView = layout.findViewById(R.id.listView);
SearchAdapter adapter = new SearchAdapter(Activity4.this, list);
listView.setAdapter(adapter);
listView.setTextFilterEnabled(true);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
if (TextUtils.isEmpty(query)) {
content = false;
adapter.getFilter().filter("");
} else {
content = true;
adapter.getFilter().filter(query);
}
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
if (!TextUtils.isEmpty(newText)) {
content = true;
// 通过适配器过滤,去掉默认黑色提示文字
adapter.getFilter().filter(newText);
} else {
content = false;
// 通过适配器清除过滤
adapter.getFilter().filter("");
}
return false;
}
});
AlertDialog.Builder alertDialog = new AlertDialog.Builder(Activity4.this);
alertDialog.setView(layout);
AlertDialog dialog = alertDialog.create();
dialog.show();
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (content) {
edit.setText(adapter.getList().get(position).get("name").toString());
dialog.dismiss();
content = false;
} else {
edit.setText(list.get(position).get("name").toString());
dialog.dismiss();
content = false;
}
}
});
// 设置对话框的大小
WindowManager manager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
Display display = manager.getDefaultDisplay();
WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
params.height = (int) (display.getHeight() * 0.8);
params.width = (int) (display.getWidth() * 0.95);
dialog.getWindow().setAttributes(params);
}
});
六:效果