没有结果的自定义ArrayAdapter过滤器自定义、过滤器、结果、ArrayAdapter

2023-09-13 00:51:52 作者:良辰未赏透

我使用的是一个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();
    }

}

}
 

Spinner下拉列表 使用ArrayAdapter和自定义Adapter实现

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

}

}