如何处理ListView项目上的长按操作?

9
我该如何捕获这种事件?onCreateContextMenu非常类似,但我不需要菜单。
4个回答

26

很难知道你想要实现什么。但是我猜测你想对接收长按操作的项目执行某些动作。为此,你有两个选项:

.

listView.setOnItemLongClickListener (new OnItemLongClickListener() {
  public boolean onItemLongClick(AdapterView parent, View view, int position, long id) {
    //do your stuff here
  }
});

请问您能否澄清一下如何将OnItemLongClickListener分配给我的ListView?非常感谢。 - LA_
谢谢,它完美地运行了。我如何获取与长按的项目相关联的特定数据库值?应该类似于 this.getListAdapter().getItem(position) 吗? - LA_
2
@LA_ T obj = (T) parent.getItemAtPosition(position); - Aleadam
谢谢,很好地解决了问题.. :) :) :) :) 我尝试使用onclick listview和lonclick listview两种方式,能够做到onclick但是做不到onlongclick.. 现在我可以在listview上做到两个了 :) :) :) :) - Rahul Baradia

14

通常情况下,长按列表项会关联到上下文菜单。您可以通过使用Activity.registerForContextMenu(View view)为列表视图注册一个上下文菜单,以使用户界面体验与其他安卓应用程序更加一致。

然后在您的应用程序中重写onContextItemSelected方法,如下所示:

@Override
public void onCreate(Bundle savedInstanceState) {
    listView = (ListView) findViewById(R.id.your_list_view);
    registerForContextMenu(listView);
}

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

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

    switch (item.getItemId()) {
    case R.id.some_item:
        // do something useful
        return true;
    default:
        return super.onContextItemSelected(item);
    }
  • 列表中的位置也保存在 info.id 中。

  • 如果你只想捕获长按事件,那么我认为 Snicolas 提出的方法可以起作用。


它不能工作。看起来是因为我没有上下文菜单 - onContextItemSelected从未被调用。 - LA_
我已经更新了代码示例。你调用了 registerForContextMenu(listView) 吗?正如其他人所说,你是想在项目长按时实现某些功能,还是想为列表视图上的项目获取上下文菜单? - Mark Fisher
我正在尝试在长按项目时启动另一个活动,因此无需显示上下文菜单。RegisterForContextMenu(listView)已经存在。 - LA_
好的,我已经添加了onCreateContextMenu()代码以保证代码完整性,但是由于您不想使用上下文菜单,这可能不是您想要的方式。尽管如此,我仍然强烈建议您在列表项长按时使用它们,也许显示“开始...”,因为这将允许用户在意外按住按钮太长时间后点击返回按钮。如果您需要长按,则可以选择其他建议中的一种方法来为视图添加新侦听器。 - Mark Fisher
还有一件事:由于我在Fragment中,我需要调用“getActivity().getMenuInflater();”,而不仅仅是“getMenuInflater();”。 - Urkman

0
将自定义的View.OnLongClickListener添加到您的视图中。它可以被多个实例共享,然后您可以使用参数。
onLongClick(View v)

了解哪个视图被点击并相应地做出反应。

敬礼, 斯蒂芬


这会影响ListView的正常滚动/快速滑动功能吗? - Jim Clay
很奇怪,但它也不起作用。我做了这个:public class BridgesCloseActivity extends ListActivity { ... OnLongClickListener longClickListener; ... longClickListener = new OnLongClickListener() { public boolean onLongClick(View v) { Log.i("", Integer.toString(v.getId())); return true; } }; - LA_
@LA_ 你可能需要让 onDown 返回 true。 - Jim Clay

0
//Deleted individual cart items
    //on list view cell long press
    cartItemList.setOnItemLongClickListener (new OnItemLongClickListener() {
          @SuppressWarnings("rawtypes")
        public boolean onItemLongClick(AdapterView parent, View view, final int position, long id) {
              final CharSequence[] items = { "Delete" };

                AlertDialog.Builder builder = new AlertDialog.Builder(context);

                builder.setTitle("Action:");
                builder.setItems(items, new DialogInterface.OnClickListener() {

                    public void onClick(DialogInterface dialog, int item) {
                        cart = cartList.get(position);
                        db.removeProductFromCart(context, cart);

                        new AlertDialog.Builder(context)
                        .setTitle(getString(R.string.success))
                        .setMessage(getString(R.string.item_removed))
                        .setPositiveButton("Done", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) { 
                                Intent intent = new Intent(CartDetailsActivity.this, HomeScreen.class);
                                startActivity(intent);
                            }
                         })
                         .show();

                    }

                });

                AlertDialog alert = builder.create();

                alert.show();
            //do your stuff here
              return false;
          }
        });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接