android - 在自动完成的自定义适配器中,使用筛选器

  显示原文与译文双语对照的内容
0 0

我在AutoCompleteTextView中显示自动完成建议时遇到 Having 问题。

下面是 TextView:


<AutoCompleteTextView
android:id="@+id/atvAddContact"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"/>

这就是我设置适配器的方式:


ArrayList<Contacto> list = cc.getContactosList("");
ContactosAdapter2 adapter = new ContactosAdapter2(this, R.layout.contact_list_item, list);
adapter.notifyDataSetChanged();

现在,这是我的适配器,它是 ListView ( 使用相同的列表项)的一个完全工作适配器副本,它实现了筛选并显示所有结果。 设置为适配器的ArrayList集包含项,因此数据在那里。

我的getFilter() 方法虽然从未调用过,但我不知道为什么,与getView相同。

我已经使用字符串 array 尝试了简单的自动完成功能,但我无法使用自定义对象解决这里自定义自动完成问题,欢迎使用任何帮助 !


import java.util.ArrayList;
import com.android.proj.R;
import com.android.proj.datas.Contacto;
import android.app.Activity;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.ImageView;
import android.widget.TextView;


public class ContactosAdapter2 extends ArrayAdapter<Contacto> implements Filterable{

Context context; 
int layoutResourceId; 
ArrayList<Contacto> data = new ArrayList<Contacto>();

public ContactosAdapter2(Context context, int layoutResourceId, ArrayList<Contacto> data) {
 super(context, layoutResourceId, data);
 this.layoutResourceId = layoutResourceId;
 this.context = context;
 this.data = data;
}

@Override
public Filter getFilter() 
{
 Filter myFilter = new Filter() 
 {
 @Override
 protected FilterResults performFiltering(CharSequence constraint) 
 {
 FilterResults filterResults = new FilterResults();
 if(constraint!= null) 
 {
 filterResults.values = data;
 filterResults.count = data.size();
 }
 return filterResults;
 }

 @Override
 protected void publishResults(CharSequence contraint, FilterResults results) 
 {
 if(results!= null && results.count> 0) 
 {
 notifyDataSetChanged();
 }
 else {
 notifyDataSetInvalidated();
 }
 }
 };
 return myFilter;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
 View row = convertView;
 ContactoHolder holder = null;

 if(row == null)
 {
 LayoutInflater inflater = ((Activity)context).getLayoutInflater();
 row = inflater.inflate(layoutResourceId, parent, false);

 holder = new ContactoHolder();
 holder.contactoNombre = (TextView)row.findViewById(R.id.tvContactoNombre);
 holder.contactoInfo = (TextView)row.findViewById(R.id.tvContactoInfo);
 holder.contactoImg = (ImageView)row.findViewById(R.id.ivContactoImg);

 row.setTag(holder);
 }
 else
 {
 holder = (ContactoHolder)row.getTag();
 }

 Contacto ap = data.get(position);
 holder.contactoNombre.setText(ap.getNombre());
 byte[] baImage = ap.getBaImage();

 if (baImage == null)
 holder.contactoImg.setImageURI(ap.getPhoto());
 else
 holder.contactoImg.setImageBitmap(BitmapFactory.decodeByteArray(baImage, 0, baImage.length));

 if (ap.getNumber().length()> 0 && ap.getNumber().charAt(0) == '#')
 holder.contactoInfo.setText(ap.getNumber().substring(1, ap.getNumber().length()));
 else
 holder.contactoInfo.setText(ap.getNumber());

 return row;
}

static class ContactoHolder
{
 TextView contactoNombre;
 TextView contactoInfo;
 ImageView contactoImg;
}
}

时间: 原作者:

0 0

( 在问题编辑中由OP回答) 。 转换为社区wiki答案。 在没有答案的情况下查看问题,但在注释中解决了问题

OP写了:

这确实很愚蠢,但我没有指明哪个适配器用于 AutoCompleteTextView,缺少的代码是:


atvAddContact.setAdapter(adapter);

原作者:
...