如何在ListView上启用LongCLicks?

时间:2013-04-07 12:35:19

标签: android android-widget

我正在尝试在我的应用中启用Long Clicks,但我无法进行编译。我在这里查看了之前问题中的示例,但我无法编译它们中的任何一个。我的主要活动被宣布为:

import android.widget.AdapterView.OnItemLongClickListener;
public class LinearLayoutDemo extends ListActivity implements OnClickListener, OnItemClickListener, OnItemLongClickListener {

在onCreate()方法中,我把它放在:

getListView().setOnItemLongClickListener(this);

对于我的ListView(myLV),我这样做了:

myLV1.setOnItemLongClickListener(new View.OnItemClickListener() {
    @Override public boolean onLongClick(View v) {
        Log.d(TAG, "setOnItemLongClickListener() called for myLV");
        return(true);
    }
});

我认为以上一定是错的,但我不知道为什么。编译器错误是

LinearLayoutDemo.java:45: com.commonsware.android.linearpct.LinearLayoutDemo is not abstract and does not override abstract method onItemLongClick(android.widget.AdapterView<?>,android.view.View,int,long) in android.widget.AdapterView.OnItemLongClickListener
[javac] public class LinearLayoutDemo extends ListActivity implements OnClickListener, OnItemClickListener, OnItemLongClickListener {

LinearLayoutDemo.java:287: cannot find symbol
[javac] symbol  : class OnItemLongClickListener
[javac] location: class android.view.View
[javac]         myLV1.setOnItemLongClickListener(new View.OnItemLongClickListener() {
[javac]                                                  ^

** * ** * ** * 的** * *** 更新 ** * ** * ** * ** * ***

我在ListActivity类定义中删除了OnItemLongClickListener。我也摆脱了这个

getListView().setOnItemLongClickListener(this);

然后我添加了这段代码并且它有效(我不知道为什么):

myLV1.setOnItemLongClickListener(new OnItemLongClickListener() {
    public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) {
        Log.d(TAG, "onItemLongClick() for LV1");
        return true;
    }
});

看起来很简单,所以我坚持下去,除非有人能告诉我我不应该这样做。

** * ** * ** * 的** * 编辑 * ** * ** * ** * ****

好的,我有Long Clicks工作。如何判断我长按哪个项目?我假设myLV1.getCheckedItemPosition()可以工作,但它没有。

没关系,它位于onItemLongClick()的'position'参数中。

3 个答案:

答案 0 :(得分:2)

您在这里做的是实际设置onLongClickListener两次:

1。 getListView().setOnItemLongClickListener(this);

这里你将Activity设置为Listener,因为它实现了onLongClickListener接口。

2。 myLV1.setOnItemLongClickListener(new View.OnItemClickListener() {....

在这里,您要创建一个新的onItemClickListener并尝试将其再次应用到列表中。 从您的活动代码中删除此部分。

并添加未实现的方法:

一旦您尝试实施onLongClick

,该{p> Activity就应该在您的onLongClickListener

在此方法中,您可以指定长按一下的操作。

<强>更新

enter image description here

  1. 右键单击错误。
  2. 添加未实现的方法。
  3. 这会将此代码添加到类中:

    @Override
    public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
        // TODO Auto-generated method stub
        return false;
    }
    

    在其中定义您的长按活动。

答案 1 :(得分:1)

你基本上可以做两件事:

  1. 删除行getListView().setOnItemLongClickListener(this);,因为您没有实现/覆盖AdapterView.OnItemLongClickListener的onItemLongClick方法

  2. 在myLV1.setOnItemLongClickListener中,您必须创建AdapterView.OnItemLongClickListener的实例,而不是View.OnItemLongClickListener

答案 2 :(得分:0)

是否要在长按ListView-Item时创建上下文菜单?

如果是这样,最简单的方法是在registerForContextMenu(findViewById(android.R.id.list)); - 方法中使用onCreate

然后你必须覆盖方法onCreateContextMenuonContextItemSelected,如下所示:

<强> onCreateContextMenu

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.my_context_layout, menu);
}

<强> onContextItemSelected

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();

    switch (item.getItemId()) {
        case R.id.my_item1:
            doSomething();
            return true;
        case R.id.my_item2:
            doSomething();
            return true;
        default:
            return super.onContextItemSelected(item);
    }
}