2012-07-02 16 views
22

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

答えて

31

Romain Guyのように見ることができますfill_parentを使用するか、リストビューの効率的な設計のためにリストビュー

ためmatch_parent (GoogleのエンジニアがUIツールキットで動作します)

幅をwrap_contentに設定すると、ListViewの幅がその子の幅と同じになるように設定されます。したがって、ListViewはアイテムを測定し、アダプタ上でgetView()を呼び出さなければならないアイテムを取得する必要があります。これは、レイアウトパスの数、親レイアウトの動作などによって数回発生することがあります。

ListViewのレイアウト幅またはレイアウト高さをwrap_contentに設定すると、ListViewはすべての単一ビューを測定しようとしますあなたが望むものではありません。

は覚えておいてください:すべての回でリストビューまたはGridViewsためwrap_contentを設定回避し、より多くの詳細は、このGoogle I/O videoListViewwrap_content高さを達成ためには、リストビュー

+8

このアドバイスは普遍的には見えません。ListView/Adapaterの組み合わせは、人々が最初に気付くよりも一般的でスケーラビリティがあります。つまり、人々は任意のデータセットでwrap_contentを使用することの結果を認識しない可能性もあります。しかし、それは、データセットが固定された、または限られたサイズのケースがたくさんあるわけではないというわけではありません。そのような場合には、wrap_contentを使用する方が判断の声が多いでしょう。 – spaaarky21

+3

これは、リントが警告すべきもののようですが、現在のところそうではありません。 –

+1

私はこの答えがなぜ受け入れられたのか分かりません。それは全く質問に答えません。また、RomainのGuyポストは、まったく別の質問だった:レイアウトが測定された回数 - 少なくとも3つのリスト項目についてwrap_contentがうまくいく理由を実際に説明するビデオを指しています。より複雑なリスト(かなりのパフォーマンスコスト)で作業することができます。 – Rick77

3
I want my list view to wrap its content horizontally and not to fill all the width. 

あなたがリスト表示のためのwrap_contentにのみ最初の3つの項目(行)を与える場合は、残りの部分は無視されます表示されますので、wrap_contentを与える..だから、ドン」することはできませんリスト表示の場合トンの使用wrap_content ...常にあなたがこのWorld of ListView

+2

fill_parentを使用しないでください。 Android 2.2では廃止されました:http://developer.android.com/reference/android/view/ViewGroup.LayoutParams.html#FILL_PARENT – spaaarky21

29

の世界の話を見るために、私たちはCustomListViewを使用する必要がありますそのextends私たちのネイティブListView

MyListView.javaこのようなあなたのlayout使用のカスタムビューで

public class MyListView extends ListView { 

    private android.view.ViewGroup.LayoutParams params; 
    private int oldCount = 0; 

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

    @Override 
    protected void onDraw(Canvas canvas) 
    { 
     if (getCount() != oldCount) 
     { 
      int height = getChildAt(0).getHeight() + 1 ; 
      oldCount = getCount(); 
      params = getLayoutParams(); 
      params.height = getCount() * height; 
      setLayoutParams(params); 
     } 

     super.onDraw(canvas); 
    } 

} 

layout.xml

<com.yourpackagename.MyListView 
     ...  
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     ... /> 
+0

完璧に動作します! – beetree

+1

すばらしい! RecyclerView内でListViewを使用したいときに私のために働いた。 – VSG24

+3

この回答は便利ですが、ListViewがRecyclerViewの中にある場合、スクロールアップはバグが多いようです。ですから実際の解決策はonMeasureメソッドをオーバーライドすることです。この回答を見てください:http://stackoverflow.com/a/24186596/1901561 – RIscRIpt

3

それはの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="" /> 
+0

はい、あなたはこれを行うことができますが、あなたはリサイクルシステムをルーズにする(または実装するのが大変です)。いくつかの項目でうまく動作しますが、ほとんどの項目では、リストビューをアダプタとして使用しないことも考えられます。 –

関連する問題