过滤Android

时间:2015-05-11 08:02:38

标签: android filter adapter realm

所以我开始使用Realm,一切正常,几乎所有东西。

我使用MultiAutoCompleteTextView选择一些用户(RealmObject)

所以这里:

这是我的Filter(我的适配器的内部类)

private class UserFilter extends Filter {
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        FilterResults filterResults = new FilterResults();
        if (constraint == null || constraint.length() == 0) {
            filterResults.values = mUsers;
            filterResults.count = mUsers.size();
        } else {
            final String lastToken = constraint.toString().toLowerCase();
            final List<User> list = new ArrayList<>();

            RealmQuery<User> query = realm.where(User.class);
            query.contains("nickname", lastToken, false);
            RealmResults<User> result = query.findAll();
            list.addAll(result);


            filterResults.values = list;
            filterResults.count = list.size();
        }
        return filterResults;
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        mFilteredUsers = (List<User>) results.values;
        if (results.count > 0) {
            notifyDataSetChanged();
        } else {
            notifyDataSetInvalidated();
        }
    }

在我的适配器中: 在getView方法中:

EGCUser user = getItem(position);

holder.mName.setText(user.getNickname());

用户是一个无效的对象,我一直在尝试这么多不同的东西,一切都失败了。 所以我想知道我能做到的是什么。 我有很多线程问题,所以也许这是内部类的问题?

由于

编辑:在这种情况下,我应该在哪里做Realm.getInstance()?

现在,我在适配器中传递一个上下文,并且我在适配器的构造函数中执行它,并且我在变量中存储了realm对象。

EDIT2:我得到了它的工作,但我不知道这是否是我们应该做的:

在我的performFiltering中,我这样做了:

((Activity)mContext).runOnUiThread(new Runnable() {
                @Override
                public void run() {

                    final List<User> list = new ArrayList<>();
                    Realm realm = Realm.getInstance(mContext);
                    RealmQuery<User> query = realm.where(User.class);
                    query.contains("nickname", lastToken, false);
                    RealmResults<User> result1 = query.findAll();
                    list.addAll(result1);

                    filterResults.values = list;
                    filterResults.count = list.size();

                }
            });

但我可以反馈这一点。

2 个答案:

答案 0 :(得分:3)

来自境界的克里斯蒂安。不幸的是,由于我们的线程限制,Realm目前不支持Filter类(并且Filter在后台线程上完成了它的工作)。我们在TODO上有它,你可以在这里关注进度:https://github.com/realm/realm-android-adapters/issues/79

在此之前,您有两种选择:

1)执行过滤UI线程。如果您在Realm中没有那么多项目或者查询相对简单,您可能会发现这很快。我们已经有使用Realm的键盘应用程序,这样做。

2)不要返回正确的Realm对象,而是读取需要显示的任何数据,然后从performFiltering()方法返回。

答案 1 :(得分:1)

我实施了一个解决方案。我做的过滤器负责帮助AutocompleteTextView。该策略包括创建一个包装类,该类封装了您想要显示的领域对象的字段。此外,它应包含主键,以便您可以检索完整的对象。

这是&#34;包装&#34;的一个例子。类:

public class RealmWrapper{

  private long oid;
  private String representation;

  public RealmWrapper(long oid, String representation) {
    this.oid = oid;
    this.representation = representation;
  }

  public long getOid() {
    return this.oid;
  }

  public void setOid(long oid) {
    this.oid = oid;
  }

  public String getRepresentation() {
    return representation;
  }

  public void setRepresentation(String representation) {
    this.representation = representation;
  }

  @Override
  public String toString() {
    return representation;
  }
}

当您从Realm中提取实体时,您将结果复制到包装器:

 List<RealmWrapper> newObjects = new ArrayList<>();
 for( User entity : (RealmResults<User>) queryResults ){
     newObjects.add( new RealmWrapper(entity.getOid(), entity.getName()) );
 }

最后,当您从视图中获取RealmViewAdapter时,您将检索原始对象:

User user = Realm.getInstance(context)
          .where(User.class)
          .contains("oid",adapter.getOid)
          .firstResult(); 

我希望这能帮到你!