2

我使用带有 ViewHolder 的自定义适配器和带有按钮的项目视图的列表。我想通过单击演示者中的按钮来处理一些事情。

如何将演示者与这些项目视图联系起来?

4

2 回答 2

2

您可以使用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;
                }
           });
}

希望这能派上用场。至少我是这样做的,但肯定不是唯一的解决方案。

于 2015-01-29T04:43:19.683 回答
-1
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.
    }
}
于 2015-01-22T09:04:10.750 回答