Android 如何将自定义适配器添加到AutoCompleteTextView
有没有简单的方法将2文本视图下拉列表设置为AutoCompleteTextView 有Android 如何将自定义适配器添加到AutoCompleteTextView,android,Android,有没有简单的方法将2文本视图下拉列表设置为AutoCompleteTextView 有android.R.layout.two\u line\u list\u item,我找不到任何如何使用的示例 所以,我尝试了这个: public class TwoLineDropdownAdapter extends BaseAdapter { private LayoutInflater mInflater = null; private Activity activity; p
android.R.layout.two\u line\u list\u item
,我找不到任何如何使用的示例
所以,我尝试了这个:
public class TwoLineDropdownAdapter extends BaseAdapter {
private LayoutInflater mInflater = null;
private Activity activity;
public ArrayList<TwoLineDropDown> values = new ArrayList<TwoLineDropDown>();
public TwoLineDropdownAdapter(Activity a, ArrayList<TwoLineDropDown> items) {
values = items;
activity = a;
mInflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getCount() {
return values.size();
}
public TwoLineDropDown getItem(int position) {
return values.get(position);
}
public long getItemId(int position) {
return position;
}
public static class ViewHolder {
public TextView title;
public TextView description;
}
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.dropdown_text_twoline,
parent, false);
holder.title = (TextView) convertView
.findViewById(R.id.text1);
holder.description = (TextView) convertView
.findViewById(R.id.text2);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
return convertView;
}
public void add(TwoLineDropDown ei) {
values.add(ei);
}
}
TwoLineDropdownAdapter AutoCompleteAdapter = new TwoLineDropdownAdapter(this, items);
myAutoComplete.setAdapter(AutoCompleteAdapter);
设置适配器时会显示:
public class TwoLineDropdownAdapter extends BaseAdapter {
private LayoutInflater mInflater = null;
private Activity activity;
public ArrayList<TwoLineDropDown> values = new ArrayList<TwoLineDropDown>();
public TwoLineDropdownAdapter(Activity a, ArrayList<TwoLineDropDown> items) {
values = items;
activity = a;
mInflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getCount() {
return values.size();
}
public TwoLineDropDown getItem(int position) {
return values.get(position);
}
public long getItemId(int position) {
return position;
}
public static class ViewHolder {
public TextView title;
public TextView description;
}
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.dropdown_text_twoline,
parent, false);
holder.title = (TextView) convertView
.findViewById(R.id.text1);
holder.description = (TextView) convertView
.findViewById(R.id.text2);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
return convertView;
}
public void add(TwoLineDropDown ei) {
values.add(ei);
}
}
TwoLineDropdownAdapter AutoCompleteAdapter = new TwoLineDropdownAdapter(this, items);
myAutoComplete.setAdapter(AutoCompleteAdapter);
绑定不匹配:类型为的泛型方法setAdapter(T)
AutoCompleteTextView不适用于参数
(TwoLineDropdownAdapter)。推断的类型TwoLineDropdownAdapter为
不是有界参数的有效替代项
如何解决这个问题
谢谢根据文档,AutoCompleteTextView中的setAdapter推断类型为:
<T extends ListAdapter & Filterable> void setAdapter(T adapter)
void setAdapter(T适配器)
您的适配器必须是ListAdapter(哪个BaseAdapter是,到目前为止还不错)和Filterable,哪个BaseAdapter不是,您的适配器实现也不是。我将扩展ArrayAdapter,它是可过滤的,更不用说它将简化您的实现(您的一些方法会复制ArrayAdapter的方法以获得相同的结果):
公共类TwoLineDropdownAdapter扩展了ArrayAdapter{
私有LayoutInflater mInflater=null;
私人活动;
公共TwoLineDropdownAdapter(活动a,ArrayList项){
超级(a,0,项目);
活动=a;
mInflater=(LayoutInflater)活动
.getSystemService(上下文布局\充气机\服务);
}
公共静态类视图持有者{
公共文本视图标题;
公共文本视图描述;
}
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视窗座;
if(convertView==null){
holder=新的ViewHolder();
convertView=mInflater.充气(R.layout.dropdown\u text\u两行,
父母,假);
holder.title=(TextView)convertView
.findviewbyd(R.id.text1);
holder.description=(TextView)convertView
.findviewbyd(R.id.text2);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
返回视图;
}
}
在这里,代码为我工作
将此适配器设置为
ProductSearchAdapter类
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.TextView;
public class ProductSearchAdapter extends ArrayAdapter<ProductDataModel> {
private ArrayList<ProductDataModel> items;
private ArrayList<ProductDataModel> itemsAll;
private ArrayList<ProductDataModel> suggestions;
private int viewResourceId;
@SuppressWarnings("unchecked")
public ProductSearchAdapter(Context context, int viewResourceId,
ArrayList<ProductDataModel> items) {
super(context, viewResourceId, items);
this.items = items;
this.itemsAll = (ArrayList<ProductDataModel>) items.clone();
this.suggestions = new ArrayList<ProductDataModel>();
this.viewResourceId = viewResourceId;
}
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(viewResourceId, null);
}
ProductDataModel product = items.get(position);
if (product != null) {
TextView productLabel = (TextView) v.findViewById(android.R.id.text1);
if (productLabel != null) {
productLabel.setText(product.getProductName());
}
}
return v;
}
@Override
public Filter getFilter() {
return nameFilter;
}
Filter nameFilter = new Filter() {
public String convertResultToString(Object resultValue) {
String str = ((ProductDataModel) (resultValue)).getProductName();
return str;
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
if (constraint != null) {
suggestions.clear();
for (ProductDataModel product : itemsAll) {
if (product.getProductName().toLowerCase()
.startsWith(constraint.toString().toLowerCase())) {
suggestions.add(product);
}
}
FilterResults filterResults = new FilterResults();
filterResults.values = suggestions;
filterResults.count = suggestions.size();
return filterResults;
} else {
return new FilterResults();
}
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
@SuppressWarnings("unchecked")
ArrayList<ProductDataModel> filteredList = (ArrayList<ProductDataModel>) results.values;
if (results != null && results.count > 0) {
clear();
for (ProductDataModel c : filteredList) {
add(c);
}
notifyDataSetChanged();
}
}
};
}
导入android.content.Context;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.Filter;
导入android.widget.TextView;
公共类ProductSearchAdapter扩展了ArrayAdapter{
私有ArrayList项;
私人ArrayList itemsAll;
私人ArrayList建议;
私有int-viewResourceId;
@抑制警告(“未选中”)
public ProductSearchAdapter(上下文,int-viewResourceId,
ArrayList项目){
超级(上下文、viewResourceId、项目);
这个项目=项目;
this.itemsAll=(ArrayList)items.clone();
this.suggestions=new ArrayList();
this.viewResourceId=viewResourceId;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
视图v=转换视图;
如果(v==null){
LayoutInflater vi=(LayoutInflater)getContext().getSystemService(
上下文。布局(充气机和服务);
v=vi.inflate(viewResourceId,null);
}
ProductDataModel产品=items.get(位置);
如果(产品!=null){
TextView产品标签=(TextView)v.findViewById(android.R.id.text1);
if(productLabel!=null){
productLabel.setText(product.getProductName());
}
}
返回v;
}
@凌驾
公共过滤器getFilter(){
返回名称过滤器;
}
过滤器名称过滤器=新过滤器(){
公共字符串ConvertResultString(对象结果值){
字符串str=((ProductDataModel)(resultValue)).getProductName();
返回str;
}
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
if(约束!=null){
建议。清晰();
对于(ProductDataModel产品:itemsAll){
if(product.getProductName().toLowerCase())
.startsWith(constraint.toString().toLowerCase()){
建议。添加(产品);
}
}
FilterResults FilterResults=新的FilterResults();
filterResults.values=建议;
filterResults.count=建议.size();
返回过滤器结果;
}否则{
返回新的FilterResults();
}
}
@凌驾
受保护的无效发布结果(CharSequence约束,
FilterResults(结果){
@抑制警告(“未选中”)
ArrayList filteredList=(ArrayList)results.values;
if(results!=null&&results.count>0){
清除();
对于(ProductDataModel c:filteredList){
添加(c);
}
notifyDataSetChanged();
}
}
};
}
我认为最简单的方法是扩展
公共类MyAdapter扩展了android.widget.SimpleAdapter{
静态ArrayList-toMapList(集合对象集合){
ArrayList objectsList=新的ArrayList(objectsCollection.size());
对于(MyObject对象:objectsCollection){
Map Map=newhashmap();
put(“name”,obj.getName());
put(“details”,obj.getDetails());
objectsList.add(映射);
};
返回对象列表;
}
公共MyAdapter(上下文、集合对象){
超级(上下文、toMapList(对象)
public class MyAdapter extends android.widget.SimpleAdapter {
static ArrayList<Map<String, String>> toMapList(Collection<MyObject> objectsCollection) {
ArrayList<Map<String, String>> objectsList = new ArrayList<Map<String, String>>(objectsCollection.size());
for (MyObject obj : objectsCollection) {
Map<String, String> map = new HashMap<String, String>();
map.put("name", obj.getName());
map.put("details", obj.getDetails());
objectsList.add(map);
};
return objectsList;
}
public MyAdapter(Context context, Collection<MyObject> objects) {
super(context, toMapList(objects),
R.layout.auto_complete_layout, new String[] {"name", "description"}, new int[] {R.id.name, R.id.description});
}
}
class StreetsAdapter( private val mContext: Context,
private val viewResourceId: Int,
private val items: ArrayList<Street>) : ArrayAdapter<Street?>(mContext, viewResourceId, items.toList()) {
private val itemsAll = items.clone() as ArrayList<Street>
private var suggestions = ArrayList<Street>()
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
var v: View? = convertView
if (v == null) {
val vi = mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
v = vi.inflate(viewResourceId, null)
}
val street: Street? = items[position]
if (street != null) {
val streetTitle = v?.findViewById(R.id.tvStreetTitle) as TextView?
streetTitle?.text = street.title
}
return v!!
}
override fun getFilter(): Filter {
return nameFilter
}
private var nameFilter: Filter = object : Filter() {
override fun convertResultToString(resultValue: Any): String {
return (resultValue as Street).title
}
override fun performFiltering(constraint: CharSequence?): FilterResults {
return if (constraint != null) {
suggestions.clear()
for (street in itemsAll) {
if (street.title.toLowerCase().startsWith(constraint.toString().toLowerCase())) {
suggestions.add(street)
}
}
val filterResults = FilterResults()
filterResults.values = suggestions
filterResults.count = suggestions.size
filterResults
} else {
FilterResults()
}
}
override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
val filteredList = results?.values as ArrayList<Street>?
if (results != null && results.count > 0) {
clear()
for (c: Street in filteredList ?: listOf<Street>()) {
add(c)
}
notifyDataSetChanged()
}
}
}
}
val adapter = StreetsAdapter(this,
R.layout.item_street, //Your layout. Make sure it has [TextView] with id "tvStreetTitle"
arrayListOf() //Your list goes here
)
autoTextView.threshold = 1 //will start working from first character
autoTextView.setAdapter(adapter)
fun AutoCompleteTextView.showListDropDown(list: List<Any?>, action:(item: Any) -> Unit){
val adapter = ArrayAdapter<Any?>(
this.context,
R.layout.custom_dropdown_item,
ArrayList<Any?>(list)
)
this.setAdapter(adapter)
this.threshold = 1
this.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id ->
val item = adapter.getItem(position)!!
action(item)
}
this.setOnTouchListener { _: View?, _: MotionEvent? ->
if (list.isNotEmpty()) {
if (this.text.toString() != "") adapter.filter
.filter(null)
this.showDropDown()
}
return@setOnTouchListener true
}
}