2013-09-27 42 views
1

我在AutoCompleteTextView中显示自动填充建议时遇到问题。在自定义适配器中使用可自动完成的可筛选

这里是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(具有相同列表项)的适配器,但实现了Filterable,它现在不过滤,并且应该显示所有结果,但不显示任何内容。设置为适配器的ArrayList充满了项目,所以数据就在那里。

虽然我的getFilter()方法从来没有被调用,我不知道为什么,与getView相同。

我已经尝试了一个简单的自动完成与字符串数组,它的工作,但我无法让我的头围绕自定义对象的自定义自动完成,任何帮助,欢迎!

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; 
} 
} 

回答

相关问题