如何在Listview的List项目中为ListView设置OnItemClickListener事件

时间:2018-09-06 06:51:58

标签: android listview

我想为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项中时,此代码才有效。

3 个答案:

答案 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)

使用界面我找到了

  

创建一个接口,然后在父适配器中实现并通过   子适配器,用户将单击子项目,然后调用   界面,它将通知父项,并执行您的代码。