- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经实现了 SearchableSpinner到我的项目。它位于 Fragment
中。
我正在使用 Realm
作为数据库。在我的 onCreateView
方法中我有这个...
@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.ncrdocument, container, false);
realm = Realm.getDefaultInstance();
documents = new ArrayList<>();
documents = realm.where(MaterialDoc.class).findAll();
ArrayAdapter<MaterialDoc> adapter = new ArrayAdapter<>(this.getContext(), android.R.layout.simple_list_item_1, documents);
matList.setAdapter(adapter);
.
.
.
return view;
数据加载正常,显示正确,但当我尝试搜索微调器时,我的应用程序崩溃并收到此错误。
An exception occured during performFiltering()
java.lang.IllegalStateException: Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created
at io.realm.BaseRealm.checkIfValid(BaseRealm.java:383)
at io.realm.MaterialDocRealmProxy.realmGet$document_number(MaterialDocRealmProxy.java:126)
at com.my.application.test.Model.MaterialDoc.getDocumentNumber(MaterialDoc.java:29)
at com.my.application.test.Model.MaterialDoc.toString(MaterialDoc.java:42)
at android.widget.ArrayAdapter$ArrayFilter.performFiltering(ArrayAdapter.java:480)
at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.os.HandlerThread.run(HandlerThread.java:61)
01-09 12:13:06.649 18606-18606/com.my.application.test D/AndroidRuntime: Shutting down VM
01-09 12:13:06.669 18606-18606/com.my.application.test E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.my.application.test, PID: 18606
java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:330)
at android.widget.AdapterView.checkFocus(AdapterView.java:947)
at android.widget.AdapterView$AdapterDataSetObserver.onInvalidated(AdapterView.java:1070)
at android.widget.AbsListView$AdapterDataSetObserver.onInvalidated(AbsListView.java:8297)
at android.database.DataSetObservable.notifyInvalidated(DataSetObservable.java:50)
at android.widget.BaseAdapter.notifyDataSetInvalidated(BaseAdapter.java:59)
at android.widget.ArrayAdapter$ArrayFilter.publishResults(ArrayAdapter.java:513)
at android.widget.Filter$ResultsHandler.handleMessage(Filter.java:282)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6939)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
最佳答案
@SarathKn 接受的答案根本没有效率,你从 Realm 复制/分离结果,你失去了自动更新和惰性评估,你立即复制了整个结果集。
results.copyFromRealm()
的用法是不受欢迎的,除非您实际上需要 一个非托管对象,通常只有当您需要通过 GSON 发送对象时,或者如果您需要以不可撤销的方式修改对象(保存/取消更改)。
使用 realm.copyFromRealm()
来“避免非法线程访问”是一个错误的答案(除非您 100% 确定这就是您要查找的内容,而且你知道自己在做什么)。
实际问题而不是所说的 hack-fix 是你正在使用 ArrayAdapter
的默认 Filter
实现,它在后台线程上执行过滤,而你实际上需要在 UI 线程上过滤 RealmResults(因为它是您在 UI 线程上显示的结果集)。
如果您查看 ArrayAdapter 的 Filterable
实现的源代码,它是这样的:
@Override
public @NonNull Filter getFilter() {
if (mFilter == null) {
mFilter = new ArrayFilter();
}
return mFilter;
}
/**
* <p>An array filter constrains the content of the array adapter with
* a prefix. Each item that does not start with the supplied prefix
* is removed from the list.</p>
*/
private class ArrayFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence prefix) {
final FilterResults results = new FilterResults();
if (mOriginalValues == null) {
synchronized (mLock) {
mOriginalValues = new ArrayList<>(mObjects);
}
}
if (prefix == null || prefix.length() == 0) {
final ArrayList<T> list;
synchronized (mLock) {
list = new ArrayList<>(mOriginalValues);
}
results.values = list;
results.count = list.size();
} else {
final String prefixString = prefix.toString().toLowerCase();
final ArrayList<T> values;
synchronized (mLock) {
values = new ArrayList<>(mOriginalValues);
}
final int count = values.size();
final ArrayList<T> newValues = new ArrayList<>();
for (int i = 0; i < count; i++) {
final T value = values.get(i);
final String valueText = value.toString().toLowerCase();
// First match against the whole, non-splitted value
if (valueText.startsWith(prefixString)) {
newValues.add(value);
} else {
final String[] words = valueText.split(" ");
for (String word : words) {
if (word.startsWith(prefixString)) {
newValues.add(value);
break;
}
}
}
}
results.values = newValues;
results.count = newValues.size();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
//noinspection unchecked
mObjects = (List<T>) results.values;
if (results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
}
但是 performFiltering
是在后台线程上执行的,而 publishResults
是在 UI 线程上执行的。
实际上,您应该将此过滤器实现替换为在 UI 线程上执行的 Realm 过滤器。
@Override
public @NonNull Filter getFilter() {
if (mFilter == null) {
mFilter = new RealmFilter();
}
return mFilter;
}
/**
* <p>An array filter constrains the content of the array adapter with
* a prefix. Each item that does not start with the supplied prefix
* is removed from the list.</p>
*/
private class RealmFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence prefix) {
return new FilterResults();
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
String prefix = constraint.toString().trim();
//noinspection unchecked
RealmQuery<MaterialDoc> query = realm.where(MaterialDoc.class);
if(prefix == null || "".equals(prefix)) {
/* do nothing */
} else {
if(prefix.contains(" ")) {
String[] words = prefix.split("\\s");
boolean isFirst = true;
for(String word : words) {
if(!"".equals(word)) {
if(isFirst) {
isFirst = false;
} else {
query = query.or();
}
query = query.beginsWith(/*enter query field name*/, word, Case.INSENSITIVE);
}
}
} else {
query = query.beginsWith(/* enter query field name*/, prefix, Case.INSENSITIVE);
}
}
mObjects = query.findAll();
notifyDataSetChanged();
}
}
但我已经回答了这个here (对于 RecyclerView here )在链接到 this Filter
solution that isn't conceptually wrong 之前从 Realm 使用的角度来看。
关于android - Searchable Spinner 与 Realm 相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41546759/
在大多数浏览器中使用 Ctrl-F 将允许您搜索文本,但仅限于文本区域。我想在应该是可访问区域的文本中搜索文本,这些区域不一定是文本呈现区域,例如 和 .是否有浏览器或插件可以满足我的要求?这些东西
您好,我正在尝试在我的应用程序中使用可搜索的 Activity,但是当按下搜索按钮时没有任何反应 AndroidManifest.xml
我需要在 DataTables 中实现一个功能,以便动态地将列的可搜索属性设置为 true/false。 https://datatables.net/ 我已经以一种方式实现了这一点。 dataObj
有没有办法自动用通配符包装所有搜索? 例如: Book.search("*${params.q}*", params) 最佳答案 我不熟悉.search(您使用插件吗?)。但是,对于模型中的通配符搜
在座的每一位可能对 Googlebot 的工作原理有一定了解的人都可能清楚地看到启动页面会损害网站的 SEO 性能。 但是,我碰巧正在处理一个相当不幸的案例,即必须为我的一个客户实现启动页面。你如何在
我有一个包含 2 个 fragment 的主要 Activity 。主要 Activity 有一个 SearchView在操作栏中。这两个 fragment 都有一个包含大量字符串的列表,List .
我正在单步执行 android 可搜索词典示例,但找不到它实际将单词加载到 sqlite 数据库中的位置。我认为它发生在 DictionaryDatabase.java 的 onCreate 方法中,
使用.searchable(text: $text)函数时,搜索时搜索栏会出现一个取消按钮。 点击取消按钮时有什么方法可以执行操作吗?我想在点击取消时调用一个函数,但不知道点击取消时如何执行操作。 A
我了解它的新功能,但这似乎是不存在的非常基本的功能。实现 .searchable 时在新的 iOS 15 中,NavigationLink 似乎根本不起作用。 理想情况下,可搜索将生成一个带有 For
我需要重新配置可搜索插件的默认设置。当我尝试运行 install-searchable-config 时,出现以下错误: 错误I / O异常加载脚本[null \ scripts \ Init.gro
对于我的 Grails 应用程序,我使用 Searchable Plugin 进行了一个不错的“类似 google”的搜索。 我按照说明并补充说: class Address { static
我正在尝试使用 Searchable 实现可搜索功能,这是 nicolaslopezj 的 Laravel 搜索特性,我使用了以下代码。但这似乎不起作用。如果数据库中只有两条记录,它会显示记录,但如果
请看这个 fiddle 。如果您将 Bootstrap 选择库放在另一个下拉列表中,它不会显示选择内容。 https://jsfiddle.net/75cndb4a/1/ Click link abo
我无法让它做任何事情。下拉只是表现正常。我已经按照他们的指示创建了我能做的最简单的演示,但仍然没有任何效果。我检查了我的路径并将所有内容都放在同一目录中以确保找到所有内容。我首先加载了 jQuery。
我打算编写一个可以在快速搜索框中提供结果的应用程序。 在 Android 1.6 中,有什么方法可以触发 Intent 将用户导航到“可搜索项目”屏幕吗? 最佳答案 警告:未记录的行为,前方有龙! 我
我们在我们的 Grails 应用程序中使用 Grails 2.1.1 和 Searchable 插件 0.6.4,并在下面用所有映射指示的某些域上实现了可搜索。 class User {
我在 SwiftUI 中使用 .searchable 修饰符。无论如何知道用户何时按下键盘上的搜索键?我知道如何使用 UIViewRepresentable 和 searchController 来做
我正在搜索::before/::after 伪元素并找到了这个 description ... 1.1. Accessibility of Generated Content Generated co
我正在尝试在特定列上设置搜索禁用。 我使用这个 Angular 数据表服务器端。 https://l-lin.github.io/angular-datatables 通常在 jquery 上,我可以
我有一个带有 searchable 的模型块,像这样: class Contact 堆栈跟踪指向 searchable通过 Contact.new 在模型中阻止 Controller 中的线路。 当
我是一名优秀的程序员,十分优秀!