【问题标题】:How to set OnItemClickListener event for ListView in List item of Listview如何在Listview的List项中为ListView设置OnItemClickListener事件
【发布时间】:2018-09-06 06:51:57
【问题描述】:

我想为listview 添加onClick() 事件。因为我在listview 里面有listview。当我点击父列表视图项目然后打开新活动时,我想要,但是当我点击子 listview 项目时,父 listview 项目点击的代码不起作用,我怎样才能为孩子 @ 提供 onClick() 事件987654328@.

 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 隐藏到父 listview 项目中时,此代码才有效。

【问题讨论】:

  • 您是否尝试过在您的父列表的适配器中实现您的子列表视图点击监听器?这里的问题是,每当您单击子列表时,您的父列表视图都会获取焦点/滚动/单击侦听器。
  • 你试过禁用父点击监听吗?
  • 我想要父列表项的点击监听,而不是子项
  • @krishsingh 尝试使用接口然后:)
  • 我认为我们需要设置 mParentListView.setTouchInterceptEnabled(true);

标签: android listview


【解决方案1】:

根据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);
}

【讨论】:

  • app crash : java.lang.UnsupportedOperationException: addView(View) is not supported in AdapterView 因为它不是 recyclerview ,它的 listview
【解决方案2】:

您必须为此使用 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;
 }
 }

【讨论】:

    【解决方案3】:

    使用界面 , 我找到了

    创建一个接口,然后在父适配器中实现并传递 子适配器,而用户将单击子项然后调用 接口,它会通知父项,并执行你的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      相关资源
      最近更新 更多