可以将LinearLayout中的子项向上移动但不会向下移动

时间:2018-01-07 16:30:53

标签: android android-layout view

有人可以解释为什么这里的第一段代码有效但不是最后一段吗?唯一的区别是我插入我的视图的索引i-1i+1i+1对索引是不可能的吗?我可以在那里写任何其他号码并且它有效。

         upButton.setOnClickListener(new View.OnClickListener() {
         @Override
            public void onClick(View v) {
                for (int i = 0; i < drawerViewGroup3.getChildCount(); i++) {
                    View view = drawerViewGroup3.getChildAt(i);
                    TextView tv = (TextView) view.findViewById(R.id.drawer_name);
                    if (tv.getText().toString().equals(drawerName.getText().toString()) && i != 0) {
                        drawerViewGroup3.removeView(view);
                        drawerViewGroup3.addView(view, i - 1);
                    }
                }
            }
        });

        downButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                for (int i = 0; i < drawerViewGroup3.getChildCount(); i++) {
                    View view = drawerViewGroup3.getChildAt(i);
                    TextView tv = (TextView) view.findViewById(R.id.drawer_name);
                    if (tv.getText().toString().equals(drawerName.getText().toString())) {
                        drawerViewGroup3.removeView(view);
                        drawerViewGroup3.addView(view, i + 1);
                    }
                }
            }
        });

应用程序的一些上下文。我有一个垂直导向的LinearLayout,里面有多个LinearLayouts。单击代码中的两个Button时,其中一个孩子将向上或向下移动,切换他们的位置。

编辑:好的,我明白了。

            downButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                View viewToMove = null;
                int viewToMovePos = drawerViewGroup3.getChildCount();
                for (int i = 0; i < drawerViewGroup3.getChildCount(); i++) {
                    View view = drawerViewGroup3.getChildAt(i);
                    TextView tv = (TextView) view.findViewById(R.id.drawer_name);
                    if (tv.getText().toString().equals(drawerName.getText().toString()) && i != drawerViewGroup3.getChildCount() - 1) {
                        viewToMovePos = i;
                        viewToMove = view;
                    }
                }
                alert.dismiss();

                if (viewToMovePos != drawerViewGroup3.getChildCount()) {
                    drawerViewGroup3.removeView(viewToMove);
                    drawerViewGroup3.addView(viewToMove, viewToMovePos + 1);
                }
            }
        });

不是最漂亮的代码,可能不会帮助别人,因为它非常具体,但这就是答案。

1 个答案:

答案 0 :(得分:0)

从LinearLayout中删除视图时,索引i处的视图现在是之后的视图您删除的视图。然后在i - 1处添加一个视图,该视图位于此视图之前(之前在删除视图之后的视图)。最终结果是您删除了一个视图并将其插回原来的位置。

相反,您需要在i - 2添加视图。

我建议您查看RecyclerView。它专门设计用于有效地为给定数据创建动态视图列表。您只需操纵数据,RecyclerView就可以为您完成所有艰苦的工作。