我使用的是一个AutoCompleteTextView一个ArrayAdapter。 results.values具有预期的价值,但我得到的UI没有列表。
公共类CustomArrayAdapter扩展ArrayAdapter<字符串>实现过滤的{
私人最终对象MLOCK =新的对象();
私人CustomFilter MFILTER;
公众的ArrayList<字符串> mItems;
公众的ArrayList<字符串> mFiltered;
公共CustomArrayAdapter(上下文的背景下,INT textViewResourceId){
超(背景下,textViewResourceId);
mItems =新的ArrayList<字符串>();
mFiltered =新的ArrayList<字符串>();
}
公共过滤用getFilter(){
如果(MFILTER == NULL){
MFILTER =新CustomFilter();
}
返回MFILTER;
}
@覆盖
公共无效添加(String s)将{
mItems.add(多个);
}
私有类CustomFilter扩展过滤器{
@覆盖
保护FilterResults performFiltering(CharSequence的约束){
FilterResults结果=新FilterResults();
如果(mItems == NULL){
同步(MLOCK){
mItems =新的ArrayList<字符串>();
}
}
如果(约束== NULL || constraint.length()== 0){
同步(MLOCK){
results.values = mItems;
results.count = mItems.size();
}
} 其他 {
最后的ArrayList<字符串> newItems =新的ArrayList<字符串>();
的for(int i = 0; I< mItems.size();我++){
最后弦乐项目= mItems.get(我);
如果(item.contains(约束)){
newItems.add(项目);
}
}
results.values = newItems;
results.count = newItems.size();
}
返回结果;
}
@燮pressWarnings(未登记)
@覆盖
保护无效publishResults(CharSequence的约束,
FilterResults结果){
mFiltered.clear();
mFiltered.addAll((ArrayList中<字符串>)results.values);
notifyDataSetChanged();
}
}
}
解决方案
看起来像覆盖一对夫妇更多的功能做了工作。 工作版本的完整源代码:
公共类CustomArrayAdapter扩展ArrayAdapter<字符串>实现过滤的{
私人列表<字符串> mOrigionalValues;
私人列表<字符串> mObjects;
私人过滤MFILTER;
公共CustomArrayAdapter(上下文的背景下,INT textViewResourceId){
超(背景下,textViewResourceId);
mOrigionalValues =新的ArrayList<字符串>();
mObjects =新的ArrayList<字符串>();
}
公共无效添加(String对象){
mOrigionalValues.add(对象);
this.notifyDataSetChanged();
}
@覆盖
公众诠释getCount将(){
返回mObjects.size();
}
@覆盖
公共字符串的getItem(INT位置){
返回mObjects.get(位置);
}
公共过滤用getFilter(){
如果(MFILTER == NULL){
MFILTER =新CustomFilter();
}
返回MFILTER;
}
@覆盖
公共无效notifyDataSetChanged(){
super.notifyDataSetChanged();
}
私有类CustomFilter扩展过滤器{
@覆盖
保护FilterResults performFiltering(CharSequence的约束){
FilterResults结果=新FilterResults();
如果(约束== NULL || constraint.length()== 0){
ArrayList的<字符串>名单=新的ArrayList<字符串>(mOrigionalValues);
results.values =清单;
results.count =则为list.size();
} 其他 {
ArrayList的<字符串> newValues =新的ArrayList<字符串>();
的for(int i = 0; I< mOrigionalValues.size();我++){
字符串项= mOrigionalValues.get(我);
如果(item.contains(约束)){
newValues.add(项目);
}
}
results.values = newValues;
results.count = newValues.size();
}
返回结果;
}
@燮pressWarnings(未登记)
@覆盖
保护无效publishResults(CharSequence的约束,
FilterResults结果){
mObjects =(名单<字符串>)results.values;
Log.d(CustomArrayAdapter,将String.valueOf(results.values));
Log.d(CustomArrayAdapter,将String.valueOf(results.count));
notifyDataSetChanged();
}
}
}
I'm using the ArrayAdapter on a AutoCompleteTextView. results.values has the expected value but I get no list on the UI.
public class CustomArrayAdapter extends ArrayAdapter<String> implements Filterable {
private final Object mLock = new Object();
private CustomFilter mFilter;
public ArrayList<String> mItems;
public ArrayList<String> mFiltered;
public CustomArrayAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
mItems = new ArrayList<String>();
mFiltered = new ArrayList<String>();
}
public Filter getFilter() {
if (mFilter == null) {
mFilter = new CustomFilter();
}
return mFilter;
}
@Override
public void add(String s) {
mItems.add(s);
}
private class CustomFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if (mItems == null) {
synchronized (mLock) {
mItems = new ArrayList<String>();
}
}
if (constraint == null || constraint.length() == 0) {
synchronized (mLock) {
results.values = mItems;
results.count = mItems.size();
}
} else {
final ArrayList<String> newItems = new ArrayList<String>();
for (int i = 0; i < mItems.size(); i++) {
final String item = mItems.get(i);
if(item.contains(constraint)) {
newItems.add(item);
}
}
results.values = newItems;
results.count = newItems.size();
}
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
mFiltered.clear();
mFiltered.addAll((ArrayList<String>) results.values);
notifyDataSetChanged();
}
}
}
解决方案
Looks like overriding a couple more functions did the job. Full source of working version:
public class CustomArrayAdapter extends ArrayAdapter<String> implements Filterable {
private List<String> mOrigionalValues;
private List<String> mObjects;
private Filter mFilter;
public CustomArrayAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
mOrigionalValues = new ArrayList<String>();
mObjects = new ArrayList<String>();
}
public void add(String object) {
mOrigionalValues.add(object);
this.notifyDataSetChanged();
}
@Override
public int getCount() {
return mObjects.size();
}
@Override
public String getItem(int position) {
return mObjects.get(position);
}
public Filter getFilter() {
if (mFilter == null) {
mFilter = new CustomFilter();
}
return mFilter;
}
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
}
private class CustomFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if(constraint == null || constraint.length() == 0) {
ArrayList<String> list = new ArrayList<String>(mOrigionalValues);
results.values = list;
results.count = list.size();
} else {
ArrayList<String> newValues = new ArrayList<String>();
for(int i = 0; i < mOrigionalValues.size(); i++) {
String item = mOrigionalValues.get(i);
if(item.contains(constraint)) {
newValues.add(item);
}
}
results.values = newValues;
results.count = newValues.size();
}
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
mObjects = (List<String>) results.values;
Log.d("CustomArrayAdapter", String.valueOf(results.values));
Log.d("CustomArrayAdapter", String.valueOf(results.count));
notifyDataSetChanged();
}
}
}