第一个示例在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) { // 做点什么 } }