2016-09-29 29 views
3

我正在通过代码将多个View s添加到Layout中。我需要每个新的View高于上一个(父级布局的顶部)。如何在使用addView时设置视图位置

编辑:为了更准确我会描述应用程序模块应该做什么。用户从屏幕底部的干净屏幕和一个按钮开始。该按钮在屏幕顶部添加一个View。接下来的点击应该会添加上一个视图,以使最新的View位于容器的顶部。该应用程序保存状态,并在重新启动用户看到以相同的顺序。

+0

问题是什么?你是什​​么意思“上一个”?你的意思是超过以前的观点的顶部?或者你的意思是放在以前的视图之上?对不起,但你真的需要更具体的关于你想要实现的目标 – SimonH

+0

我的意思是“放在以前的视图之上”。我从数据库加载一些数据,我希望按最新记录排序。它不是问题,因为我可以从列表的末尾加载它。但后来当用户动态添加下一个视图时,它应该出现在其余的顶部。这就是问题的精神。 – Gniewomir

回答

3

拨打按钮的onClick事件以下方法。

private final int LAYOUT_TOP_INDEX = 0; 

private void addViewOnTop(View view){ 
    if(layout != null && view !=null) 
     layout.addView(view, LAYOUT_TOP_INDEX); 
} 

其中“布局”是您的布局(例如,LinearLayout中),以视图所要添加。

1

确实需要更多的信息才能给出更准确的答案,但是如果您在说我认为您是什么,那么您可以将这些视图添加到LinearLayout中,并将方向设置为垂直。

假设你迭代一个列表来动态添加视图,而不是从0递增,从列表大小递减。

for(int i = size; i >= 0; i--){ 
    linearLayout.add(new TextView(Context)); 
} 
+0

没关系,但我没有给你足够的细节,所以你的答案有点遗漏。 – Gniewomir

0

如果你的意思是增加的,而不是它下面的编程方式,使新的一个高于前一个加了看法,那么我的建议是:

  • 保持与你想要的物品一个ArrayList转化为视图
  • 将它们放入ListView中
  • 如果您想要添加一个必须出现在列表顶部的新视图,请将其作为ArrayList的第一个元素插入,并从中重新创建ListView。
+0

这会工作,但我想避免使用ListView。选择的答案在我的情况下效果最好。 – Gniewomir

1

ViewGroup小号View位置由LayoutParams

定义这是如何发生的呢?查看通过他们的LayoutParams到其父ViewGroups

//100% programatic approach with simple LayoutParams 
       LinearLayout myLinearLayout = new LinearLayout(this); 

    //if the **parent** of the new linear layout is a FrameLayout 
       FrameLayout.LayoutParams layoutParams = 
new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT); 

       //or if you have the XML file you don't have to worry about this 
       //myLinearLayout = (LinearLayout)findViewById(R.id.my_simple_linear_layout); 


       //you could have a LinkedList<TextView> 
       LinkedList<TextView> textViewList = new LinkedList<>(); 


       //assuming the order is the correct order to be displayed 
       Iterator<TextView> descendingIterator = textViewList.descendingIterator(); 

       while(descendingIterator.hasNext()) 
       { 
        //just add each TextView programatically to the ViewGroup 
        TextView tView = descendingIterator.next(); 
        myLinearLayout.addView(tView); 
       } 

就像我们的LinearLayout我们也可以定义的LayoutParams为TextView

重要的限定的LayoutParams:设置的LayoutParams当你需要确保他们适合的ViewGroup中,那就是观的添加

private TextView textViewFactory(String myText) { 


      TextView tView = new TextView(getBaseContext()); 

      //controling the position relatively to the PARENT 
      //because you are adding the textview to a LINEAR LAYOUT 
      LinearLayout.LayoutParams paramsExample = 
        new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, 
          LinearLayout.LayoutParams.WRAP_CONTENT, 1.0f); 

      tView.setLayoutParams(paramsExample); 


      //configuring the insides of the textview 
      //you can also do all kinds of stuff programatically 
      tView.setGravity(Gravity.CENTER_HORIZONTAL); 

      tView.setPadding(10, 10, 10, 10); 
      tView.setTypeface(Typeface.DEFAULT_BOLD);// (null, Typeface.BOLD_ITALIC); 
      tView.setTypeface(Typeface.SANS_SERIF); 
      tView.setTypeface(null, Typeface.ITALIC); 
      tView.setTypeface(Typeface.defaultFromStyle(R.style.AppTheme)); 
      tView.setId(R.id.aux_info); 

      tView.setText(myText); 
      //.........all kinds of stuff really 

      return tView; 
    } 
+1

@Gniewomir在完成答案后,我只看到了编辑内容,您是否还想要按钮的完整代码? – HenriqueMS

+1

这应该够了,我今天要测试你的答案。谢谢你美丽的回答。 – Gniewomir

+1

@Gniewomir好吧然后;)如果你遇到任何问题的代码让我知道或标记答案为接受请=) – HenriqueMS

相关问题