2

私はAndroidアプリを開発しています。私のアプリでは、ビューを動的に追加し、コードでもその重みを設定しています。しかし、それは機能していません。

これは、動的ビューのコンテナーの XML です。

<ScrollView>
.
.
.

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

.
.
.
</ScrollView>

これは、コントロールを動的に追加する方法です。

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>

しかし、それは適切に体重を設定していません。実際には、各行には 2 つの列があり、各列は画面幅の半分でなければなりません。しかし、それは機能していません。

これはスクリーンショットです:

ここに画像の説明を入力

ご覧のとおり、画面を半分ずつ取りません。どうすれば修正できますか?

4

3 に答える 3

1

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>

スクリーンショット:ここに画像の説明を入力

于 2016-05-18T11:01:04.927 に答える
0

これを試して、staggerdgridlayoutマネージャーを使用してください

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

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

列は、列の要件を置き換えます

于 2016-05-18T10:37:21.353 に答える
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);

それはうまくいくかもしれません。

于 2016-05-17T13:14:02.253 に答える