首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AutoCompleteTextView文本过滤

AutoCompleteTextView文本过滤
EN

Stack Overflow用户
提问于 2016-04-29 16:01:11
回答 2查看 425关注 0票数 0

我正在尝试使用AutoCompleteTextView进行过滤,而且我的过滤器有问题。它返回ArrayList中的所有项,而不是过滤的项。下面是我的代码:

代码语言:javascript
复制
 Filter nameFilter = new Filter() {
    @Override
    public String convertResultToString(Object resultValue) {
        String str = ((State)(resultValue)).getName();
        Log.e("Conv"+TAG, str);
        return str;
    }
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        if(constraint != null) {
            suggestions.clear();
            for (State customer : itemsAll) {
                Log.e("Ite "+TAG, "" + itemsAll.size());
                Log.e("Cons " + TAG, constraint.toString());
                Log.e("Sta" + TAG, customer.getName()); //This is always null
                if(customer.getName().toLowerCase().contains(constraint.toString().toLowerCase())) {
                    suggestions.add(customer);
                }
            }
            FilterResults filterResults = new FilterResults();
            filterResults.values = suggestions;
            filterResults.count = suggestions.size();
            return filterResults;
        } else {
            return new FilterResults();
        }
    }
    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        List<State> filteredList = (ArrayList<State>) results.values;
        if(results != null && results.count > 0) {
            clear();
            Log.e("D "+TAG, ""+results.count);
            for (State c : filteredList) {
                Log.e("The "+TAG, c.getName() + " " + c.getId());
                add(c);
                notifyDataSetChanged();
            }
        } else {
            Log.e(TAG, "Empty Filter");
            notifyDataSetChanged();
        }
    }
};

然后我开始登录,我注意到这一行总是空的Log.e("Sta" + TAG, customer.getName()); //This is always null,而这一行Log.e("Cons " + TAG, constraint.toString());和该行Log.e("Ite "+TAG, "" + itemsAll.size());永远都不是空的。约束不能确定为空,除非没有传递文本。但是,当itemsAll.size()不为空或为空时,第一个对象为空。我很困惑。下面是我的List初始化

代码语言:javascript
复制
private static final String TAG = "StateAdapter";
private ArrayList<State> items;
private ArrayList<State> itemsAll;
private ArrayList<State> suggestions;
private Context context;
private int viewResourceId;

public StateAutoCompleteAdapter(Context context, int resource, int textViewResourceId, ArrayList<State> objects) {
    super(context, resource, textViewResourceId, objects);
    this.context = context;
    this.items = objects;
    this.itemsAll = new ArrayList<State>(items);
    this.suggestions = new ArrayList<State>();
    this.viewResourceId = resource;
}

对于getView函数

代码语言:javascript
复制
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(viewResourceId, null);
    }
    State customer = items.get(position);
    if (customer != null) {
        TextView customerNameLabel = (TextView) v.findViewById(R.id.bakerName);
        TextView bakerAddress = (TextView) v.findViewById(R.id.bakerAddress);
        if (customerNameLabel != null) {
//              Log.i(MY_DEBUG_TAG, "getView Customer Name:"+customer.getName());
            customerNameLabel.setText(customer.getName());
            bakerAddress.setVisibility(View.GONE);
        }
    }
    return v;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-29 21:24:23

所以,我自己解决了问题。因此,我使用了一个普通的BaseAdapter,并扩展了Filterable,因此,对于那些可能需要如何在AutoCompleteTextView中使用RealmDB的人,您可以这样做。

代码语言:javascript
复制
 public class LgasAutoCompleteAdapter extends BaseAdapter implements Filterable {

private static final String TAG = "LgasAutoComp";
private Context mContext;
private List<Lga> mResult = new ArrayList<>();
private LayoutInflater inflater;

public LgasAutoCompleteAdapter(Context mContext) {
    this.mContext = mContext;
}

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

@Override
public Object getItem(int position) {
    return mResult.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View view, ViewGroup parent) {
    if (inflater == null)
        inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    if (view == null)
        view = inflater.inflate(R.layout.item_baker_autocomplete, parent, false);

    Lga lga = mResult.get(position);

    TextView customerNameLabel = (TextView) view.findViewById(R.id.bakerName);
    TextView bakerAddress = (TextView) view.findViewById(R.id.bakerAddress);

    if (lga != null) {
        if (customerNameLabel != null) {
//              Log.i(MY_DEBUG_TAG, "getView Customer Name:"+customer.getName());
            customerNameLabel.setText(lga.getName());
            bakerAddress.setVisibility(View.GONE);
        }
    }

    return view;
}

@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {
            return null;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults filterResults) {
            if (constraint != null) {
                //String query = constraint.toString().toLowerCase();
                mResult = filterStates(constraint.toString());
                Log.e(TAG, ""+mResult.size());
                notifyDataSetChanged();
            } else {
                notifyDataSetInvalidated();
            }
        }
    };
}

@NonNull
private List<Lga> filterStates(String query) {
    Realm mRealm = RealmUtils.getRealmInstance(mContext);
    return mRealm.where(Lga.class)
            .contains("name", query)
            .or()
            .beginsWith("name", query)
            .findAll();
}
}
票数 1
EN

Stack Overflow用户

发布于 2016-04-29 18:35:34

clear()方法可能会导致问题。因此,请检查它的代码,为您正在清理的数组列表。

另一个问题是,您在getView()中使用getView(),在performFiltering(CharSequence constraint)中使用suggestions.add(customer);

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36942859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档