您必须为此使用 Rx 事件总线。事件总线实用程序可以轻松识别正在调用的事件。例如,在您在适配器的项目持有者内的情况下,您可以在单击的列表视图中获取项目的位置。
heightListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
RXEventBusUtils.getInstance().postEvent(new StartActivityEvent(i));
}
});
RxEventBusUtils 类
public class RXEventBusUtils {
private static RXEventBusUtils sRXEventBusUtils;
private PublishSubject<Object> mPublishSubject;
public static RXEventBusUtils getInstance() {
if (sRXEventBusUtils == null) {
sRXEventBusUtils = new RXEventBusUtils();
}
return sRXEventBusUtils;
}
public PublishSubject getSubject() {
if (null == mPublishSubject) {
mPublishSubject = PublishSubject.create();
}
return mPublishSubject;
}
public void postEvent(Object event) {
getSubject().onNext(event);
}
}
StartActivityEvent 类
public class StartActivityEvent {
int position;
public StartActivityEvent () {
}
public int getPosition() {
return position;
}
}
在您的活动中,您必须在 onCreate 方法中订阅 Rx Event Bus Utils。
disposable = RXEventBusUtils.getInstance().getSubject().subscribeOn(AndroidSchedulers.mainThread())
.subscribe(this::onReceiveEvent);
这一行订阅(注册)事件总线并创建一个方法 onReceiveEvent 并将事件作为对象传递。在此方法中,您可以检查此处接收到的事件,因此您可以执行您想要的功能。
private void onReceiveEvent(Object event) {
if (event instanceof StartActivityEvent) {
// start activity
}
if (event instanceof DeleteItemEvent) {
/// delete item etc
}
}
并且不要忘记在应用级别的 gradle 文件中添加依赖项
implementation 'io.reactivex.rxjava2:rxjava:2.1.5'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
请记住一件事,您必须为不同类型的功能创建单独的事件类。
所以对于子列表视图,您只需注册新事件即可执行点击监听
childListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
RXEventBusUtils.getInstance().postEvent(new DeleteItemEvent(i));
}
});
DeleteItemEvent 类
public class DeleteItemEvent {
int position;
public DeleteItemEvent () {
}
public int getPosition() {
return position;
}
}