32

私はアンドロイドに取り組んでいます。リストビューでコンテンツを水平方向に折り返し、すべての幅を埋めないようにします。wrap_contentプロパティが機能していません。何をすべきか?

4

5 に答える 5

60

wrap_contentで高さを達成するには、ネイティブを使用するListView必要があります。CustomListViewextendsListView

MyListView.java

public class MyListView extends ListView {

    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyListView(Context context) {
        super(context);
    }

    public MyListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }

}

layoutこのようなカスタムビューを使用すると、

layout.xml

<com.yourpackagename.MyListView
        ...       
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        ... />
于 2015-07-28T11:22:26.247 に答える
39

Romain Guy(GoogleエンジニアはUIツールキットに取り組んでいます)が彼の投稿で言ったように

幅を設定することにより、wrap_contentListViewにその子の中で最も幅の広いものと同じ幅になるように指示します。したがって、ListViewはそのアイテムを測定し、アイテムを取得するには、アダプタでgetView()を呼び出す必要があります。これは、レイアウトパスの数、親レイアウトの動作などによっては、数回発生する可能性があります。

したがって、ListViewのレイアウト幅またはレイアウト高さをListViewに設定するwrap_contentと、それに接続されているすべてのビューが測定されます。これは、絶対に必要なものではありません。

覚えておいてください:wrap_content ListViewsまたはGridViewsの設定は常に避けてください。詳細については、listviewの世界について説明しているこのGoogle I/Oビデオを参照してください。

于 2012-07-02T14:03:15.543 に答える
4

これは、LinearLayoutを使用して実装できます。

この例のように作成します。

public class LinearLayoutAdapter   {
    LinearLayout linearLayout;
    ArrayList<String>  arrayList 
    private View rootView;
    private static LayoutInflater inflater;

    public ChoicesAdapter_(ArrayList<String>  arrayList ,LinearLayout linearLayout)
    {
        this.index =index;
        this.arrayList=arrayList;
        this.linearLayout=linearLayout;
        notifyDataSetChanged();
    }
    private void notifyDataSetChanged() {
        linearLayout.removeAllViews();
        for (int i =0;i<getCount();i++){
            linearLayout.addView(getView(i,null,null));
        }
    }
    public int getCount() {
        return  arrayList.size();
    }
    public Object getItem(int position) {
        return null;
    }
    public long getItemId(int position) {
        return 0;
    }
    public View getView(final int position, View convertView, ViewGroup parent) {
       rootView = inflater.inflate(R.layout.row_list, null);
       TextView  textView = (TextView)rootView.findViewById(R.id.text);    
       textView.setText(arrayList.get(position));
        return rootView;
    }
}

MainActivityの例:

public class MainActivity extends Activity    {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ArrayList<String>  arrayList = new  ArrayList<String>();
        arrayList.add("Accent");
        arrayList.add("Acclaim");
        arrayList.add("Accord");
        arrayList.add("Achieva");
        arrayList.add("Aerio");
        arrayList.add("Aerostar");
        LinearLayout linearLayout = (LinearLayout)findViewById(R.id.linearLayout);
        linearLayoutAdapter= LinearLayoutAdapter(arrayList,linearLayout);
    }
}

XMLの例:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:gravity="center"
    android:textColor="@color/dark_gray"
    android:background="@color/white"
    android:textSize="20dp"
    android:text=""  />
于 2016-07-10T18:05:02.287 に答える
3
I want my list view to wrap its content horizontally and not to fill all the width. 

リストビューの場合、wrap_contentを指定することはできません。これは、リストビューにwrap_contentを指定すると、最初の3つの項目(行)のみが表示され、残りは無視されるためです。したがって、wrap_contentは使用しないでください。常にfill_parentまたはmatch_parentを使用してください。リストビュー

リストビューで効率的に設計するために、このリストビューの世界を見ることができます

于 2012-07-02T14:03:06.127 に答える
0

私はこの質問に答えるには少し遅すぎることを知っています。しかし、私の意見では、ListViewにある程度のwrap_content動作を持たせたい場合は、開始マージンと終了マージンを静的な値に設定できます。私の場合、これはうまくいきました。さまざまな画面サイズでそれを行うことに関心がある場合は、このシナリオを処理するのに非常に役立つライブラリがあります。スケーラブルなDP。githubで一度確認してください。

于 2022-01-06T19:48:23.643 に答える