因此,这不是代码的技术问题,而是更多的思想问题。我是android开发的新手,因此我对它所提供的许多功能并不完全熟悉。

我在屏幕上有一个项目列表,您可以上下滚动查看不同的项目。

当我决定让项目能够左右滑动以显示诸如panal的设置时,下面有几个opton(每个项目在其下面都有其自己的设置,而不是所有交易类型的设置屏幕)时,出现了我的问题)。我四处寻找实现此目的的不同方法,但似乎找不到可行的方法。到目前为止,我在想的是在屏幕上向左或向右设置菜单的同时,在项目中放一个HorizonalScrollView,但是当我将文本区域放入HorizonalScrollView时,它只占一半屏幕,所以我可以并排放置两个,而不是我想要的,最终结果将不是我的想象。我真的很想要一个允许设置位于项目下的解决方案,因此当您将其推开时,它会显示设置。

有没有更好的方法,还是我应该继续尝试使我的HorizonalScrollView正常工作,我将不胜感激任何有关如何进行此工作的指南或想法。

通过我的应用程序查看是否可以找到具有类似功能的应用程序,gmail应用程序具有该功能。这是指向图像的链接,可向您提供一个想法,将项目滑动到侧面后,它将在项目的位置弹出一个撤消或存档按钮,就好像它们隐藏在滑动的列表项下

最佳答案

这个问题是一个很有趣的话题。并准备做一定数量的风俗习惯。

首先,删除Horizo​​nalScrollView,我认为这不会帮助您。每个项目的布局应如下所示(伪代码,您可以自己构建XML =]):

FrameLayout
   RelativeLayout id:topContent background:someSolidColor
          // inside this RelativeLayout, the stuff that is visible on the ListView
   RelativeLayout id:bottomContent
          // inside this RelativeLayout, the stuff that is behind the content
/FrameLayout


这样一来,您实际上会将一件事放在另一件事之上。另请注意,topContent的背景为纯色。如果您未指定任何背景,则两个RelativeLayouts都将可见。还要注意,我之所以使用RelativeLayout,只是因为我喜欢它们,并且喜欢它们的灵活性,但这取决于列表视图的内容和设置。

现在,事情变得很有趣了,您将需要一个GestureDetector来检测手指的滑动,并使用该值在id:topContent上生成边距偏移量。

您可以这样创建一个TouchListener:

public class MySlideListener extends View.OnTouchListener{

    private View v;
    private GestureDetector gestureDetector;

    public MySlideListener (View v){
        this.v = v;
        gestureDetector = new GestureDetector(v.getContext(), myGestureListener);
    }

   public boolean onTouch (View v, MotionEvent event){
         return gestureDetector.onTouchEvent(event);
   }

    private SimpleOnGestureListener myGestureListener = new SimpleOnGestureListener(){
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY){

           // now here we make the view scroll
           MarginLayoutParams lp = (MarginLayoutParams) view.getLayoutParams();
           lp.leftMargin = distanceX;
           lp.rightMargin = -distanceX;

          // You might need to call view.requestLayout();
          //  but first give it a try without it

          // This part of the method for processing the horizontal
          // offset can (and should) be further developed to add some
          // 'snap-in' or transparency functionality to make the whole
          // concept work better.
          // But this code should give you a proof of concept on how to deal with stuff.

          // The important part is that now you have a call back that have access
          // to the view during onScroll.

          // Also might be necessary to enable/disable the bottomContent view
          // in order for it to be not clickable whilst not visible.

           return true;
        }
    }
}


然后使用topContent为ListView的每个topContentView.setOnTouchListener(new MySlideListener(topContentView));(可能在适配器的getView内)设置一个新的那些侦听器

请记住,我全心全意地键入了所有代码,并且未经100%测试!

编辑:

上面的代码是正确的方向,但这是100%未经测试的事情。
现在,下面的代码已经编译,测试,并且该代码有效!

由于您只能创建一个类并将相同的实例应用于在适配器上创建的所有项目,因此该类的效率也更高。您可以看到它使视图在触摸事件上滚动。

public class MySlideListener implements View.OnTouchListener {

    private View view;
    private ListView listView;
    private GestureDetector gestureDetector;

    public MySlideListener(ListView lv) {
        listView = lv;
        gestureDetector = new GestureDetector(lv.getContext(), myGestureListener);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        view = v;
        gestureDetector.onTouchEvent(event);
        return true;
    }

    private SimpleOnGestureListener myGestureListener = new SimpleOnGestureListener() {

    private int origLeft, origRight;

    public boolean onDown(MotionEvent e) {
        MarginLayoutParams lp = (MarginLayoutParams) view.getLayoutParams();
        origLeft = lp.leftMargin;
        origRight = lp.rightMargin;
        return true;
    };

    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        listView.requestDisallowInterceptTouchEvent(true);
        MarginLayoutParams lp = (MarginLayoutParams) view.getLayoutParams();
        lp.leftMargin = (int) (origLeft + (e2.getRawX() - e1.getRawX()));
        lp.rightMargin = (int) (origRight - (e2.getRawX() - e1.getRawX()));
        view.requestLayout();
        return true;
    };
    };
}

10-08 08:24