我使用带有 ViewHolder 的自定义适配器和带有按钮的项目视图的列表。我想通过单击演示者中的按钮来处理一些事情。
如何将演示者与这些项目视图联系起来?
您可以使用rx-android来观察 AdapterView 的点击事件,方法如下。它与 Mortar 中使用的 MVP 模式完美结合。首先依赖:
compile 'io.reactivex:rxjava:1.0.4'
compile 'io.reactivex:rxandroid:0.24.0'
observeClicks
然后在您的视图类中创建方法。
public Observable<OnItemClickEvent> observeClicks() {
return WidgetObservable.itemClicks(adapterView);
}
订阅 Presenter 中的事件onLoad
:
private Subscription clicks;
@Override
protected void onLoad() {
super.onLoad();
clicks = getView().observeClicks().subscribe(
new Action1<OnItemClickEvent>() {
@Override
public void call(OnItemClickEvent event) {
// handle click events
}
}
);
}
protected void onDestroy() {
// unsubscribe from events
clicks.unsubscribe();
}
您也可以映射OnItemClickEvent
到视图内的数据并观察它而不是原始事件。
public Observable<YourDataClass> observeClicks() {
return WidgetObservable.itemClicks(adapterView).
map(new Func1<OnItemClickEvent, YourDataClass>() {
@Override
public YourDataClass call(OnItemClickEvent onItemClickEvent) {
YourDataClass item = adapter.getItem(onItemClickEvent.position());
return item;
}
});
}
希望这能派上用场。至少我是这样做的,但肯定不是唯一的解决方案。
ListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//Handle your stuff here.
});
像这样的东西?使用位置将当前项目从您的列表中取出。
纽扣 :
// In the adapter
Button butt = (Button) rowView.findViewById(R.id.yourbutton);
butt.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
//Button Action.
}
}