处理onLong点击主要活动中的子视图

时间:2017-11-19 14:28:32

标签: android android-layout listview onlongclicklistener

我有一个包含一堆子视图的主活动,然后我有一个ListView,其项目是动态生成的。我希望能够长按任何这些项目并在主活动中处理此事件。

MainActivity
  LinearLayout
    ListView
      Item - (long click here)

现在我知道如何订阅动态创建的ListView项本身的onLongClick事件,但是我在用于创建项目的适配器中。

我希望的是,我可以简单地订阅主活动的onLongClick事件,并且我会看到动态创建的ListView项目中的事件传播到MainActivity。但那并没有发生。

我的MainActivity实现了View.OnLongClickListener,就像这样

class MainActivity : Activity(), View.OnLongClickListener {
    override fun onLongClick(v: View?): Boolean {
        Log.d("APP", "LongClicked: ")
        return true
    }
    ......
}

但是,我不确定如何在Activity本身中设置处理程序。也就是说,对于onClick,我会在主要活动的XML中设置android:onClcik="onCLick",但是,我没有看到为onLongClick执行相同操作的选项 此外,我设置任何属性,例如android::longClickable="true/false"

任何观点。我对真/假和实际意味着什么感到困惑。

任何帮助都将不胜感激。

更新 我尝试在主活动中调用ListView上的setOnLongCLickListener,因为我可以在那里访问ListView。像这样

availableZonesListView = findViewById(R.id.availableZonesListView)
availableZonesListView!!.onLongClickListener(this)

MainActivity('this')实现了View.OnLongClickListener,当我直接长按MainActivity / Layout时,我看到那里发生的事件。但是,当我长按ListView的项目

时,我看不到有事件进入

1 个答案:

答案 0 :(得分:0)

  

现在我知道如何订阅动态创建的ListView项目本身的onLongClick事件,但是我用来创建项目的适配器中的那些事件。

public MainActivity extends .. implements MyClickListener {

 ... onCreate {
     ... =  new MyAdapter(yourParams, this); // `this` is the new param 

 }

  @Override
  public void onAnyItemLongClicked() {
       // Do whatever you want
  }


}

创建新界面:

interface MyClickListener {

   void onAnyItemLongClicked();

}

然后在您的适配器中"现在我知道如何订阅onLongClick事件" 。它会是这样的:

public class MyAdapter {

    // other fields
    private final MyClickListener listener;


    public MyAdapter(otherParams, MyClickListener listener) {
        .. assign other params
        this.listener = listener;
    }

}

// However you set your item click listener (in getView)

adapter.setOnItemLongClickListener(new OnItemLongClickListener() {
     @Override
     public void onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
          listener.onAnyItemLongClicked();
     }
});

这会将click事件从适配器传播到活动。

(我不得不即兴发挥,因为你没有分享很多代码细节)