我想为onClick()
添加listview
事件。因为我在listview
中有listview
。并且我想要当我单击父项listview项然后打开新活动时,但是当我单击子项listview
项时,父项listview
项单击的代码不起作用,如何给{{1 }}儿童onClick()
的事件。
ListView
仅当我将子项 heightListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
startActivity(new Intent(LocationMapHistory.this,LocationHistoryActivity.class));
}
});
隐藏到父项listview
项中时,此代码才有效。
答案 0 :(得分:0)
根据ChrLipp's answer,不建议在Listview
内创建ListView
。我对此的解决方法是创建一个ViewGroup
,即。 LinearLayout
并手动管理Viewgroup
个孩子。
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
MyHolder myholder = (MyHolder)holder;
View child = LayoutInflater.from(context).inflate(R.layout.child, myholder.viewgroup, false);
child.setOnClickListener(yourListener);
holder.viewgroup.addView(child);
}
答案 1 :(得分:0)
您必须为此使用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;
}
}
答案 2 :(得分:0)
使用界面, 我找到了
创建一个接口,然后在父适配器中实现并通过 子适配器,用户将单击子项目,然后调用 界面,它将通知父项,并执行您的代码。