2013-05-28 2 views
5

Я пытаюсь установить пользовательские arrayadapter для моего autocompletetextview как этотAutoCompleteTextView с пользовательским адаптером и фильтрует

public class AutoCompleteContactArrayAdapter extends 
    ArrayAdapter<Map<String, String>> implements Filterable { 
private Context mContext; 
private List<Map<String, String>> mContactList; 

public AutoCompleteContactArrayAdapter(Context context, 
     List<Map<String, String>> objects) { 
    super(context, R.layout.auto_contact_list, objects); 
    mContext = context; 
    mContactList = objects; 
    // TODO Auto-generated constructor stub 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater) mContext 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View rowView = inflater.inflate(R.layout.auto_contact_list, parent, 
      false); 
    TextView nameView = (TextView) rowView.findViewById(R.id.ccontName); 
    TextView phoneView = (TextView) rowView.findViewById(R.id.ccontNo); 
    TextView typeView = (TextView) rowView.findViewById(R.id.ccontType); 
    Map<String, String> contactMap = mContactList.get(position); 

    nameView.setText(contactMap.get("name")); 
    phoneView.setText(contactMap.get("phone")); 
    typeView.setText(contactMap.get("type")); 

    return rowView; 
} 
@Override 
public Filter getFilter() { 
    return new Filter() { 
     @Override 
     protected void publishResults(CharSequence constraint, 
       FilterResults results) { 

      if (results.count > 0) { 
       notifyDataSetChanged(); 
      } else { 
       notifyDataSetInvalidated(); 
      } 
     } 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      ArrayList<String> result = new ArrayList<String>(); 
      result.add("test"); 
      result.add("another"); 
      result.add("last"); 
      FilterResults r = new FilterResults(); 
      r.values = result; 
      r.count = result.size(); 
      return r; 
     } 
    }; 
} 
} 

В отладить приложение входит в filter методы как publishResults и performFiltering но набор результат, который отображается не мой тест array [тест, другой, последний] вместо этого он просто показывает все результаты, игнорируя мой фильтр

ответ

1

Хорошо я думаю, что я понять, что Luksprog говорил этот код работает теперь ключ это

mContactList = (ArrayList<Map<String, String>>) results.values; 

в

@Override 
public int getCount(){ 
    return mContactList.size(); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater) mContext 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View rowView = inflater.inflate(R.layout.auto_contact_list, parent, 
      false); 
    TextView nameView = (TextView) rowView.findViewById(R.id.ccontName); 
    TextView phoneView = (TextView) rowView.findViewById(R.id.ccontNo); 
    TextView typeView = (TextView) rowView.findViewById(R.id.ccontType); 
    Map<String, String> contactMap = mContactList.get(position); 

    nameView.setText(contactMap.get("name")); 
    phoneView.setText(contactMap.get("phone")); 
    typeView.setText(contactMap.get("type")); 

    return rowView; 
} 
@Override 
public Filter getFilter() { 
    return new Filter() { 
     @Override 
     protected void publishResults(CharSequence constraint, 
       FilterResults results) { 

      if (results.count > 0) { 
       mContactList = (ArrayList<Map<String, String>>) results.values; 
       notifyDataSetChanged(); 
      } else { 
       notifyDataSetInvalidated(); 
      } 
     } 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      ArrayList<Map<String, String>> result = new ArrayList<Map<String, String>>(); 
      HashMap<String,String> myMap = new HashMap<String,String>(); 
      myMap.put("name", "key"); 
      result.add(myMap); 
      HashMap<String,String> myMap2 = new HashMap<String,String>(); 
      myMap2.put("name", "is"); 
      result.add(myMap2); 
      HashMap<String,String> myMap3 = new HashMap<String,String>(); 
      myMap3.put("name", "another"); 
      result.add(myMap3); 
      FilterResults r = new FilterResults(); 
      r.values = result; 
      r.count = result.size(); 
      return r; 
     } 
    }; 
} 
24

Здесь находится текущая реализация моего кода:

XML-

<AutoCompleteTextView 
    android:id="@+id/searchAutoComplete" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_centerVertical="true" 
    android:layout_marginRight="10dp" 
    android:layout_toRightOf="@+id/linearLayout1" 
    android:background="@drawable/abs__textfield_search_default_holo_light" 
    android:drawableLeft="@drawable/abs__ic_search_api_holo_light" 
    android:drawableRight="@drawable/abs__ic_clear_holo_light" 
    android:hint="@string/search" 
    android:imeOptions="actionSearch" 
    android:inputType="textAutoComplete|textAutoCorrect" > 

Адаптер:

import java.util.ArrayList; 
import java.util.List; 

import android.content.Context; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.Filter; 
import android.widget.Filterable; 

public class AutoCompleteAdapter extends ArrayAdapter<String> implements Filterable { 

    private ArrayList<String> fullList; 
    private ArrayList<String> mOriginalValues; 
    private ArrayFilter mFilter; 

    public AutoCompleteAdapter(Context context, int resource, int textViewResourceId, List<String> objects) { 

     super(context, resource, textViewResourceId, objects); 
     fullList = (ArrayList<String>) objects; 
     mOriginalValues = new ArrayList<String>(fullList); 

    } 

    @Override 
    public int getCount() { 
     return fullList.size(); 
    } 

    @Override 
    public String getItem(int position) { 
     return fullList.get(position); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     return super.getView(position, convertView, parent); 
    } 

    @Override 
    public Filter getFilter() { 
     if (mFilter == null) { 
      mFilter = new ArrayFilter(); 
     } 
     return mFilter; 
    } 


    private class ArrayFilter extends Filter { 
     private Object lock; 

     @Override 
     protected FilterResults performFiltering(CharSequence prefix) { 
      FilterResults results = new FilterResults(); 

      if (mOriginalValues == null) { 
       synchronized (lock) { 
        mOriginalValues = new ArrayList<String>(fullList); 
       } 
      } 

      if (prefix == null || prefix.length() == 0) { 
       synchronized (lock) { 
        ArrayList<String> list = new ArrayList<String>(mOriginalValues); 
        results.values = list; 
        results.count = list.size(); 
       } 
      } else { 
       final String prefixString = prefix.toString().toLowerCase(); 

       ArrayList<String> values = mOriginalValues; 
       int count = values.size(); 

       ArrayList<String> newValues = new ArrayList<String>(count); 

       for (int i = 0; i < count; i++) { 
        String item = values.get(i); 
        if (item.toLowerCase().contains(prefixString)) { 
         newValues.add(item); 
        } 

       } 

       results.values = newValues; 
       results.count = newValues.size(); 
      } 

      return results; 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 

     if(results.values!=null){ 
     fullList = (ArrayList<String>) results.values; 
     }else{ 
      fullList = new ArrayList<String>(); 
     } 
      if (results.count > 0) { 
       notifyDataSetChanged(); 
      } else { 
       notifyDataSetInvalidated(); 
      } 
     } 
    } 
} 

d, наконец, в коде инициализации, как это ...

 ArrayList<String> searchArrayList= new ArrayList<String>(); 
//initilaze this array with your data 
     AutoCompleteAdapter adapter = new AutoCompleteAdapter(this, android.R.layout.simple_dropdown_item_1line, android.R.id.text1, searchArrayList); 
     autoCompleteTextView = (AutoCompleteTextView) customNav.findViewById(R.id.searchAutoComplete); 
     autoCompleteTextView.setAdapter(adapter); 

Готово :)

+0

Привет, Я понимаю почти все, кроме 'mOriginalValues'. Я не понимаю, для чего нам это нужно. Вы можете мне объяснить, пожалуйста? – Ray

+0

Это не оптимизированный код, который вы можете изменить в соответствии с вашими потребностями :) –

+0

+1 Очень хорошее решение. Спасибо, что поделились. Ты спас свой день. Большое спасибо;) – Sajmon

0

AutoCompleteTextView использует адаптер, чтобы показать автозаполнения предложение упасть.

Adapater должен быть фильтруемым и должен отображать данные для заполнения каждого элемента из списка данных. Autocompletetextview использует фильтр, определенный в адаптере, для получения результатов и отображения их.

Итак, если вам нужно создать пользовательский адаптер, вам необходимо предоставить реализацию getView и предоставить класс фильтра.

Полный рабочий пример AutoCompleteTextView пользовательского макета и пользовательского адаптера

http://www.zoftino.com/android-autocompletetextview-custom-layout-and-adapter

Смежные вопросы