我的 Android 应用程序中有以下代码,试图防止多次单击按钮:
RxView.clicks(bSubmit)
.debounce(2500, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(c -> displayToast());
Run Code Online (Sandbox Code Playgroud)
但此代码的作用不是执行代码,然后防止在同一时间跨度内执行多次点击,而是在去抖时间跨度过去后执行命令。
我怎样才能实现我想要的?
我有一个需要发出网络请求的点击事件.
RxView.clicks(button)
.flatMapCompletable({ x -> networkCall() })
.subscribe(...)
Run Code Online (Sandbox Code Playgroud)
点击是一个Observable.
networkCall返回一个Completable.
但是,subscribe当我点击按钮时,内部的块永远不会被调用.
我也试过了
RxView.clicks(button)
.flatMap({ x -> networkCall().toObservable<Void>() })
.subscribe(...)
Run Code Online (Sandbox Code Playgroud)
我怎样才能让它工作,以便每次点击按钮时,都会发出一个网络请求,然后在该处理中进行处理subscribe.
编辑:
我还没有做过网络的东西,所以目前只是
public Completable networkCall() {
Completable.complete();
}
Run Code Online (Sandbox Code Playgroud)
所以它保证完成.
我在我的 Android 应用程序中有一个用例,我希望允许用户在开始搜索之前输入“一定数量”的文本进行搜索。当用户键入附加文本时,我想使用输入的完整文本启动进一步搜索。
在研究了许多选项后,我找到了 Jake WhartonsRxBinding图书馆,并认为这将是一个很好的解决方案
使用这样的代码:-
RxTextView.textChanges(editTextVariableName)
.debounce(500, TimeUnit.MILLISECONDS)
.subscribe(new Action1<String>() {
@Override
public void call(String value) {
// do some work with the updated text
}
});
Run Code Online (Sandbox Code Playgroud)
但是我无法导入Action1,上面的代码是否不再有效?我缺少哪个依赖项?
我的 gradle 文件类似于这个
// https://mvnrepository.com/artifact/com.jakewharton.rxbinding2/rxbinding
implementation group: 'com.jakewharton.rxbinding2', name: 'rxbinding', version: '2.1.1'
// https://mvnrepository.com/artifact/com.jakewharton.rxbinding2/rxbinding-appcompat-v7
implementation group: 'com.jakewharton.rxbinding2', name: 'rxbinding-appcompat-v7', version: '2.1.1'
// https://mvnrepository.com/artifact/com.jakewharton.rxbinding2/rxbinding-support-v4
implementation group: 'com.jakewharton.rxbinding2', name: 'rxbinding-support-v4', version: '2.1.1'
// https://mvnrepository.com/artifact/io.reactivex.rxjava2/rxandroid
implementation group: 'io.reactivex.rxjava2', name: 'rxandroid', version: '2.0.2'
// https://mvnrepository.com/artifact/io.reactivex.rxjava2/rxjava
implementation group: 'io.reactivex.rxjava2', name: 'rxjava', …Run Code Online (Sandbox Code Playgroud) 我在Fragment中有一个RecyclerView,如该SO回答中所述,使用RxJava2处理了项目单击,在非片段中工作正常。
private PublishSubject<Place> itemViewClickSubject = PublishSubject.create();
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.search_result_view, parent, false);
ViewHolder viewHolder = new ViewHolder(view);
// convert click events into reactive stream
RxView.clicks(view)
.takeUntil(RxView.detaches(parent))
// viewHolder.getPlace() is null until it get bound
.map(__ -> viewHolder.getPlace())
.subscribe(itemViewClickSubject);
return viewHolder;
}
Run Code Online (Sandbox Code Playgroud)
片段中的RecyclerView只能正常运行一次。在项目单击片段上替换为另一个片段。后按后,出现RecyclerView片段,但单击不再起作用。
如果我删除该.takeUntil(RxView.detaches(parent))行,它将起作用。我认为有必要在RecyclerView未显示(分离)时破坏RxView单击的牢固绑定。我该如何解决这个问题?我正在寻找使用附加/分离事件之一解决问题的方法,任何建议都很棒!谢谢。
android android-fragments android-recyclerview rx-binding rx-java2
我想使用 RxJava2 在 RecyclerView 项目上设置一个监听器。项目是复选框。我想分别听每个项目。所以我得到一个错误内部类 ViewHolder 的构造函数只能用包含类的接收器调用
返回 TraceAdapter.ViewHolder(view)
class TraceAdapter(private var checkList: List<TraceViewModelRow> = listOf()) :
RecyclerView.Adapter<TraceAdapter.ViewHolder>() {
private val publishSubject = PublishSubject.create<Event>()
val events: Observable<Event> = publishSubject
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TraceAdapter.ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_trace_task, parent, false)
return TraceAdapter.ViewHolder(view)
}
override fun getItemCount(): Int = checkList.size
override fun onBindViewHolder(holder: TraceAdapter.ViewHolder, position: Int) {
holder.bindTraceList(checkList[position])
}
override fun onViewRecycled(holder: ViewHolder) {
super.onViewRecycled(holder)
}
inner class ViewHolder(override val containerView: View) : RecyclerView.ViewHolder(containerView), LayoutContainer {
fun bindTraceList(trace: …Run Code Online (Sandbox Code Playgroud) 我想在我的项目中将RxJava绑定API用于Android UI小部件。
因此,请遵循本网站' https://github.com/JakeWharton/RxBinding ' 的指导
但是我无法在Kotlin文件中导入任何Android UI小部件。 如果我在Java File中使用这些小部件,那么在哪里工作也很好。 因此,一直没有找到这个问题的实际。
作为参考,以下是在同一项目中使用的gradle文件和类文件(kotlin和Java)
build.gradle
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.0.0-beta01'
implementation 'androidx.core:core-ktx:1.2.0-alpha01'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.0-alpha4'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha4'
implementation 'io.reactivex.rxjava2:rxjava:2.2.8'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
//RxBinding
implementation 'com.jakewharton.rxbinding3:rxbinding:3.0.0-alpha2'
}
Run Code Online (Sandbox Code Playgroud)
BindingExample.java类
RxBindingExample.kt类
已尝试在SO上探索此问题,但对于lib'com.jakewharton.rxbinding2:rxbinding'的先前版本可用问题或解决方案
所以我想用rx-java2进行表单验证.我正在使用Kotlin.我遇到了两个问题.emailObservable和passwordObservable都是类型Disposable!.我尝试通过调用指定类型,val emailObservable: Observable<Boolean>但Android Studio认为它Disposable!.
其次,当我想使用方法时combineLatest出现错误:使用提供的参数不能调用以下任何函数.
emailObservable和passwordObservable都能正常工作.我是rx-java的新手,我对这种类型的东西很困惑.
val emailObservable = RxTextView.afterTextChangeEvents(textEmail)
.observeOn(AndroidSchedulers.mainThread())
.map { x -> textEmail.text.length > 3 }
.subscribe { x -> foo(x) }
val passwordObservable =RxTextView.afterTextChangeEvents(textPassword)
.observeOn(AndroidSchedulers.mainThread())
.map { x -> textPassword.text.length > 5 }
.subscribe { x -> foo(x) }
Observable.combineLatest(emailObservable,
passwordObservable,
BiFunction { x: Boolean, y:Boolean -> x && y })
Run Code Online (Sandbox Code Playgroud)