【问题标题】:Slide In button effect of List View item for AndroidAndroid 列表视图项的滑入按钮效果
【发布时间】:2011-07-01 04:24:04
【问题描述】:

我正在将 iPhone 应用程序移植到 android 应用程序中,其中一个困难是重新创建 iPhone 原生的功能。

我发现了 iPhone 的原生功能: 当用户在列表视图中对列出的项目执行滑动触摸时,会出现一个删除按钮。

android 有这个版本吗? 可以使用和重复使用/定制吗?

【问题讨论】:

  • 而不是它,它们有特定的行为..就像长按一样,选项列表来了..
  • 我真的很想知道这个......:)

标签: android listview android-listview slidetoggle


【解决方案1】:

这只是实现起来有点复杂。这就是我会从更高的层次上谈论的事情。

  1. 创建自定义 ViewGroup/Layout 来保存列表项。在此布局中,您有文本行图像或您拥有的任何内容以及删除按钮。您还可以在这里收听隐藏或取消隐藏删除按钮的手势。

  2. 在您的列表适配器中,您需要跟踪哪些项目显示了删除按钮,哪些项目没有。此外,您将需要对每个列表项删除按钮应用单击侦听器。每次在列表项上分配这些状态时,您应该 setTag(...) 并存储列表项位置,以便在单击它时可以知道必须删除哪个项目编号。

  3. 删除后必须刷新列表才能生效。根据您使用的适配器类型,这将决定您如何刷新适配器。

希望这有点道理。但我绝对认为这是最简单的方法,因为我已经用类似的功能做了几次。

【讨论】:

    【解决方案2】:

    我想您可以尝试在列表视图本身上实现手势侦听器,但可能很难获得正确的 id。由于我自己没有做过,所以无法准确回答。

    否则,您可以将自己的视图视为列表视图中的项目,并在所有子视图中设置手势监听器。

    Fling gesture detection on grid layout 一些基本的阅读和代码示例

    【讨论】:

      【解决方案3】:

      我认为没有任何内置的 API 函数可以做到这一点。

      但是,一种解决方法是在 listitem 中的视图上使用 onFling 函数。你也许可以用它来完成你想要的。

      【讨论】:

        【解决方案4】:

        这就是我实现这种效果的方式。我们有一个 ListView lvSimple,我们将 onTouchListener 添加到我们的 lvSimple。这是我的工作代码。

        float historicX = Float.NaN, historicY = Float.NaN;
        static final int DELTA = 50;
        enum Direction {LEFT, RIGHT;}
        ...
        ListView lvSimple = (ListView) findViewById(R.id.linLayout);
        ...
        lvSimple.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) 
            {
                // TODO Auto-generated method stub
                switch (event.getAction()) 
                {
                    case MotionEvent.ACTION_DOWN:
                    historicX = event.getX();
                    historicY = event.getY();
                    break;
        
                    case MotionEvent.ACTION_UP:
                    if (event.getX() - historicX < -DELTA) 
                    {
                        FunctionDeleteRowWhenSlidingLeft();
                        return true;
                    }
                    else if (event.getX() - historicX > DELTA)  
                    {
                        FunctionDeleteRowWhenSlidingRight();
                        return true;
                    } break;
                    default: return false;
                }
                return false;
            }
        });
        

        当我们向左滑动时调用 FunctionDeleteRowWhenSlidingLeft() 函数,FunctionDeleteRowWhenSlidingRight - 分别向右滑动。在这个函数中你需要粘贴动画代码。

        ps。我很抱歉我的英语不好。总是乐于提供帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多