2016-05-17 174 views
1

我正在开发Android应用程序。在我的应用程序中,我动态添加视图并在代码中设置其重量。但它不起作用。请参阅下面的代码。设置布局权重以动态添加视图在Android中不起作用

这是我的动态视图

<ScrollView> 
. 
. 
. 

<LinearLayout 
     android:orientation="vertical" 
     android:id="@+id/id_related_container" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"></LinearLayout> 

. 
. 
. 
</ScrollView> 

容器XML这是怎么了我动态将控件添加到它。

private void addRelatedItemViews(final ArrayList<Item> relatedItems) 
    { 
     LinearLayout subContainer= new LinearLayout(this); 
     LinearLayout.LayoutParams initialParam = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
     subContainer.setLayoutParams(initialParam); 
     relatedItemsContainer.addView(subContainer); 
     for(int i=0;i<relatedItems.size();i++) 
     { 
      if(i>0 && i%2==0) 
      { 
       //initialize sub container 
       subContainer = new LinearLayout(this); 
       LinearLayout.LayoutParams subContainerParam = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
       subContainer.setLayoutParams(subContainerParam); 
       relatedItemsContainer.addView(subContainer); 
      } 
      final int index = i; 
      View view = layoutInflater.inflate(R.layout.realated_item_view,null); 
      ImageView imageView = (ImageView)view.findViewById(R.id.iv_related_item_image); 
      TextView tvName = (TextView)view.findViewById(R.id.tv_related_item_name); 
      TextView tvPrice = (TextView)view.findViewById(R.id.tv_related_item_price); 
      TextView tvLikeCount = (TextView)view.findViewById(R.id.tv_related_item_like_count); 
      Picasso.with(getBaseContext()).load(relatedItems.get(i).getMediumImageUrl()).into(imageView); 
      tvName.setText(relatedItems.get(i).getName()); 
      tvPrice.setText(CommonHelper.formatCurrency(relatedItems.get(i).getPrice())); 
      tvLikeCount.setText(CommonHelper.formatLikeCount(relatedItems.get(i).getLikeCount()) + " like"); 
      view.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        openItemActivity(relatedItems.get(index).getId()); 
       } 
      }); 
      LinearLayout itemContainer = new LinearLayout(this); 
      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT,1); 
      itemContainer.setLayoutParams(params); 
      itemContainer.addView(view); 
      subContainer.addView(itemContainer); 
     } 
    } 

这是我realated_item_view.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="wrap_content" 
    android:layout_weight="1" 
    android:padding="3dp" 

    android:layout_height="wrap_content"> 
    <LinearLayout 
     android:background="@drawable/item_bg" 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 
     <ImageView 
      android:id="@+id/iv_related_item_image" 
      android:scaleType="centerCrop" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 
     <LinearLayout 
      android:padding="5dp" 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 
      <TextView 
       android:textStyle="bold" 
       android:textSize="17dp" 
       android:id="@+id/tv_related_item_name" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" /> 
      <TextView 
       android:layout_marginTop="3dp" 
       android:textSize="13dp" 
       android:id="@+id/tv_related_item_price" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" /> 
      <TextView 
       android:layout_marginTop="3dp" 
       android:textSize="10dp" 
       android:id="@+id/tv_related_item_like_count" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" /> 
     </LinearLayout> 
    </LinearLayout> 
</LinearLayout> 

但它不是设置它的重量正确。实际上,每行有两列,每列必须是屏幕宽度的一半。但它不起作用。

这是截图:

enter image description here

正如你所看到的,它不是由一半拍摄画面的一半。我该如何解决它?

+0

必须调用requestLayout()的任何布局更改生效。 – Nanoc

+0

我试过了。但正如你可以在屏幕截图中看到的,物品和它的图像并不相同。 –

+0

如果你想使用权重,你需要添加另一个视图,以便它们可以使它们宽度为50%,无论如何,这对于没有太多控制权的xml是可以的,但是在代码中,您只需计算并使用像素值。 – Nanoc

回答

0

而不是ViewGroup.LayoutParams尝试与LinearLayout.LayoutParams并设置布局宽度为0

LinearLayout itemContainer = new LinearLayout(this); 
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT,1); 
itemContainer.setLayoutParams(params); 

它可能会奏效。

+0

它给了我一样的。我编辑了截图。问题是我希望每个图像都可以占用一半的屏幕,而不管它是多大。但不要抱歉。请问我该如何解决这个问题? –

+0

@WaiYan这个答案是对的,但是你也需要添加另外一个重量的视图 – Nanoc

0

尝试这种 使用straggerdgridlayout经理

RecyclerView recyclerView =(RecyclerView)findViewById(R.id.recycler_view); recyclerView.setHasFixedSize(true);

gaggeredGridLayoutManager = new StaggeredGridLayoutManager(column, 1); 
    recyclerView.setLayoutManager(gaggeredGridLayoutManager); 

列替换您的列

0

的要求试试下面这个在您的realated_item_view.xml(WRAP_CONTENT到FILL_PARENT)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="fill_parent" 
    android:layout_weight="1" 
    android:padding="3dp" 

,改变你的Java代码:

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT,1); 
     itemContainer.setLayoutParams(params); 
     itemContainer.addView(view); 
     subContainer.addView(itemContainer); 

但是也许你的图像会被宽度拉长。但它会根据需要填充一半宽度。

更新:

我不知道你为什么试过以上解决方案失败。所以我写了一个参考的小演示。它可以根据需要使用ScrollView。但我强烈建议你应该使用GridView来改善性能!

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.test_layout); 

    LinearLayout containerLayout = (LinearLayout) findViewById(R.id.container_layout); 
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 

    LayoutInflater inflater = getLayoutInflater(); 
    for (int i = 0; i < 4; i ++){ 
     LinearLayout subLayout = new LinearLayout(this); 
     subLayout.setOrientation(LinearLayout.HORIZONTAL); 
     LinearLayout.LayoutParams subParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, 1); 
     for (int j = 0; j < 3; j ++){ 
      View v = inflater.inflate(R.layout.test_item_layout, null, false); 
      if (j == 1){ 
       ImageView imageView = (ImageView) v.findViewById(R.id.imageView); 
       imageView.setImageResource(R.drawable.icon); 
      } 
      subLayout.addView(v, subParams); 
     } 
     containerLayout.addView(subLayout, params); 
    } 

} 

test_item_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:gravity="center_horizontal" 
android:layout_width="match_parent" 
android:layout_height="wrap_content"> 
<ImageView 
    android:id="@+id/imageView" 
    android:src="@mipmap/ic_launcher" 
    android:scaleType="centerCrop" 
    android:layout_width="match_parent" 
    android:layout_height="100dip" /> 
<TextView 
    android:text="Test label" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 
</LinearLayout> 

test_layout。XML

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="match_parent" 
android:layout_height="match_parent"> 
<ScrollView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <LinearLayout 
     android:id="@+id/container_layout" 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

    </LinearLayout> 
</ScrollView> 

</LinearLayout> 

截图:enter image description here

+0

不工作。我已经尝试了将宽度设置为match_parent –

+0

对不起,因为我的错误,您还需要在将WRAP_CONTENT中的项目视图添加到FILL_PARENT(或MATCH_PARENT)时更改LayoutParams。看到我更新的答案。 – Ken

+0

我试过了。它不工作。 –