第一个示例在Kotlin中重新实现,并使用RxJava进行更清晰的交互。
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.support.v7.widget.RecyclerView
import rx.subjects.PublishSubject
public class SampleAdapter(private val items: Array<String>) : RecyclerView.Adapter<SampleAdapter.ViewHolder>() {
// 从rx.subject更改为不同的主题以获得不同的行为
// 例如,BehaviorSubject允许在订阅时接收上一个事件
// 另一方面,PublishSubject仅在订阅后才发送事件,这对于点击是理想的
public val itemClickStream: PublishSubject<View> = PublishSubject.create()
override fun getItemCount(): Int {
return items.size
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder? {
val v = LayoutInflater.from(parent.getContext()).inflate(R.layout.text_row_item, parent, false);
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(items[position])
}
public inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
private val textView: TextView by lazy { view.findViewById(R.id.textView) as TextView }
init {
view.setOnClickListener{ v -> itemClickStream.onNext(v) }
}
fun bind(text: String) {
textView.text= text
}
}
}
用法很简单。使用RxJava工具可以在单独的线程上进行订阅。
val adapter = SampleAdapter(arrayOf("Hello", "World"))
adapter.itemClickStream.subscribe { v ->
if (v.id == R.id.textView) {
// 做点什么
}
}