片段中的片段中的片段以及ListView动画中的片段

时间:2013-01-02 17:54:35

标签: android listview animation android-fragments adapter

所以,我正在尝试使用动画,到目前为止,这是一个非常头痛的问题。我在这里尝试做的事情与我通常看到的有点不同。

该场景是我在Activity启动时使用FragmentTransactions夸大ListFragment。当我点击列表项时,我希望项目滚动到屏幕顶部,使其顶部触及操作栏的底部。不仅如此,我希望列表项的底部扩展到屏幕的底部。在完成所有这些工作的同时,我想在列表项下的现在展开的区域中使用FragmentTransactions添加另一个ListFragment。父ListView应该是不可滚动的,但仍然可以点击,因为用户想要点击顶部的锁定列表项来折叠展开的区域。你可以想象当我点击内部ListFragment中的另一个列表项时会发生什么,它会重复整个过程。

假设我们打开了多个片段,那些锁定列表项应该叠加在一起。我希望能够向下拖动当前的一个以查看所有这些堆叠在彼此之上,这可能是ListView设置为不可滚动的问题。你可以说这里的想法是试图限制滚动到某个区域。

我已经完成或尝试过的是在列表项XML中添加FrameLayout并将其可见性设置为GONE。我把它的宽度和高度都设置为match_parent。我已经可以看到问题了,因为如果相对布局的高度设置为128dp的高度,并且我希望Frame_Layout的高度一直到屏幕的底部,我该怎么做?无论如何,我还将底部边距设置为减去它的高度,以隐藏它并稍后展开,这样当项目展开时它将推动其下方的任何其他列表项目。我正在使用ValueAnimator将动画值从展开设置为折叠,但我认为我的代码错误或搞砸了。我对这一切感到很困惑,但这是我的代码。它都是在View.onClickListener中的自定义适配器的getView方法中构建的。这带来了另一个问题。如果我首先覆盖ListFragment中的onListItemClick(),那么View.onClickListener或onListItemClick()?

public void setAnimation(final View item, final View viewToBeExpanded)
    {
        // Gets the height and the reference for viewToBeExpanded's LayoutParams
        layoutParams = ((FrameLayout.LayoutParams) viewToBeExpanded.getLayoutParams());
        viewToBeExpanded_height = layoutParams.height;
        viewToBeExpanded_bottomMargin = layoutParams.bottomMargin;
        layoutParams.bottomMargin = -viewToBeExpanded_height + viewToBeExpanded_bottomMargin;

        item.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view) {

                if (expanded == true) {
                    expanded = false;
                    expandAnimator = ValueAnimator.ofInt(layoutParams.bottomMargin, viewToBeExpanded_bottomMargin);
                    expandAnimator.setTarget(viewToBeExpanded);
                    expandAnimator.setDuration(500);
                    expandAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                        @Override
                        public void onAnimationUpdate(ValueAnimator animation) {
                            layoutParams.bottomMargin = (Integer) animation.getAnimatedValue();
                            viewToBeExpanded.invalidate();
                            viewToBeExpanded.requestLayout();
                        }
                    });
                    viewToBeExpanded.setVisibility(View.VISIBLE);
                    expandAnimator.start();
                } else {
                    collapseAnimator = ValueAnimator.ofInt(viewToBeExpanded_bottomMargin, -viewToBeExpanded_height + viewToBeExpanded_bottomMargin);
                    collapseAnimator.setTarget(viewToBeExpanded);
                    collapseAnimator.setDuration(500);
                    collapseAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                        @Override
                        public void onAnimationUpdate(ValueAnimator animation) {
                            layoutParams.bottomMargin = (Integer) animation.getAnimatedValue();
                            viewToBeExpanded.invalidate();
                            viewToBeExpanded.requestLayout();
                        }
                    });
                    collapseAnimator.start();
                }
            }
        });
        viewToBeExpanded.setVisibility(View.GONE);
    } 

0 个答案:

没有答案