所以我开始使用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对象.
编辑2:我得到了它的工作,但我不知道这是否是我们应该做的:
在我的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();
}
});
但我会公开反馈.
解决方法:
来自境界的基督徒在这里.不幸的是,由于我们的线程限制,Realm目前不支持Filter类(并且Filter在后台线程上执行它的工作).我们在TODO上有它,你可以在这里跟进:https://github.com/realm/realm-android-adapters/issues/79
在此之前,您有两种选择:
1)执行过滤UI线程.如果您在Realm中没有那么多项,或者查询相对简单,您可能会发现这很快.我们已经有使用Realm的键盘应用程序,这样做.
2)不要返回正确的Realm对象,而是读取需要显示的任何数据,并从performFiltering()方法返回该数据.