1

我正在尝试在我的应用程序中启用长点击,但我无法编译它。我在这里查看了以前问题中的示例,但我无法编译它们中的任何一个。我的主要活动被宣布为:

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

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

** * ** * ** * ** *编辑* ** * ** * ** * ****

好的,我有长点击工作。如何判断我长按了哪个项目?我曾假设 myLV1.getCheckedItemPosition() 会起作用,但事实并非如此。

没关系,它在 onItemLongClick() 的“位置”参数中。

4

3 回答 3

2

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

1. getListView().setOnItemLongClickListener(this);

在这里,您将 设置Activity为侦听器,因为它实现了onLongClickListener接口。

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

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

并添加未实现的方法:

onLongClickActivity一旦您尝试实施,就应该在您的活动中onLongClickListener

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

更新:

在此处输入图像描述

  1. 右键单击错误。
  2. 添加未实现的方法。

这会将您添加到类中:

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

在其中定义您对长按的操作。

于 2013-04-07T12:55:12.227 回答
1

你基本上可以做两件事:

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

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

于 2013-04-07T12:50:02.073 回答
0

您想在长按 ListView-Item 时创建上下文菜单吗?

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

然后你必须重写这些方法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);
    }
}
于 2013-04-07T12:54:59.640 回答