【问题标题】:Android Correct way if implementing filterable in Auto-CompleteAndroid 如果在自动完成中实现可过滤的正确方法
【发布时间】:2011-07-07 02:29:15
【问题描述】:

我想要做的是,惨败是这样的:

在我看来,我有一个自动完成的 Textview。 我想通过 GET 获取一个 json 对象数组。大约需要1-2秒... (我应该使用 AsyncTask 还是 Handler 来支持这种获取?)

然后根据这个数组过滤用户的输入。

目前我已经实现了我的自定义适配器......

public class StationAdapter extends BaseAdapter implements Filterable {

Context _ctx;
//returned stations...
ArrayList<Station> _stations;

// to hold original stations...
private ArrayList<Station> orig;

//Custom filter to be used
private final StationFilter filter;

public StationAdapter(final Context ctx, final ArrayList<Station> stations) {
    this._ctx = ctx;
    this._stations = stations;
    this.orig = stations;
    this.filter = new StationFilter();
}

@Override
public int getCount() {
    if (_stations != null)
        return _stations.size();
    else
        return 0;
}

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


//IS unused? NO whats its real purpose ?...
@Override
public long getItemId(final int position) {
    return (position);
}


@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
    StationView sv;
    if (convertView == null)
        sv = new StationView(_ctx, _stations.get(position));
    else {
        sv = (StationView) convertView;
        sv.setCode(_stations.get(position).mCode);
        sv.setName(_stations.get(position).mName);
    }
    return sv;
}

@Override
public Filter getFilter() {
    return filter;
}

private class StationFilter extends Filter {

    @Override
    protected FilterResults performFiltering(final CharSequence constraint) {

        final FilterResults oReturn = new FilterResults();
        final ArrayList<Station> results = new ArrayList<Station>();
        if (orig == null)
            orig = _stations;
        if (constraint != null) {
            if (orig != null && orig.size() > 0) {
                for (final Station g : orig) {
                    if (g.mName.contains(constraint.toString().toUpperCase()))
                        results.add(g);
                }
            }
            oReturn.values = results;
        }
        return oReturn;

    }

    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(final CharSequence constraint, final FilterResults results) {
        _stations = (ArrayList<Station>) results.values;
        notifyDataSetChanged();
    }
}

}

由于某种原因,过滤后的响应每隔一个输入键就会触发一次,我的 main.xml 看起来就像这样......

        <AutoCompleteTextView android:id="@+id/search_stations"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:lines="1"
        android:singleLine="true"          
        />

有人可以指出我做错了什么以及一些处理这种用例的教程

提前致谢

【问题讨论】:

    标签: android autocomplete android-asynctask


    【解决方案1】:

    这已经很晚了,但我相信这是预期的行为。过滤逻辑将在另一个请求传出时将请求排队。因此,如果您输入“a”,它将获取结果,之后的任何字母都将等待“a”的结果返回。在这些结果返回后,将发出一个新请求,依此类推。

    【讨论】:

      【解决方案2】:

      萨拉姆 我找到了解决方案 这是您必须制作的代码

      if (constraint != null) {
                      if (orig != null && orig.size() > 0) {
                          for (final station g : orig) {
                              if (g.getName().toLowerCase()
                                      .contains(constraint.toString()))
                                  results.add(g);
                          }
                      }
                      oReturn.values = results;
                  }
      

      【讨论】:

        猜你喜欢
        • 2013-05-13
        • 1970-01-01
        • 2014-05-09
        • 1970-01-01
        • 1970-01-01
        • 2013-07-25
        • 2010-10-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多