私はアンドロイドに取り組んでいます。リストビューでコンテンツを水平方向に折り返し、すべての幅を埋めないようにします。wrap_contentプロパティが機能していません。何をすべきか?
5 に答える
wrap_content
で高さを達成するには、ネイティブを使用するListView
必要があります。CustomListView
extends
ListView
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"
... />
Romain Guy(GoogleエンジニアはUIツールキットに取り組んでいます)が彼の投稿で言ったように
幅を設定することにより、wrap_content
ListViewにその子の中で最も幅の広いものと同じ幅になるように指示します。したがって、ListViewはそのアイテムを測定し、アイテムを取得するには、アダプタでgetView()を呼び出す必要があります。これは、レイアウトパスの数、親レイアウトの動作などによっては、数回発生する可能性があります。
したがって、ListViewのレイアウト幅またはレイアウト高さをListViewに設定するwrap_content
と、それに接続されているすべてのビューが測定されます。これは、絶対に必要なものではありません。
覚えておいてください:wrap_content
ListViewsまたはGridViewsの設定は常に避けてください。詳細については、listviewの世界について説明しているこのGoogle I/Oビデオを参照してください。
これは、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="" />
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を使用してください。リストビュー
リストビューで効率的に設計するために、このリストビューの世界を見ることができます
私はこの質問に答えるには少し遅すぎることを知っています。しかし、私の意見では、ListViewにある程度のwrap_content動作を持たせたい場合は、開始マージンと終了マージンを静的な値に設定できます。私の場合、これはうまくいきました。さまざまな画面サイズでそれを行うことに関心がある場合は、このシナリオを処理するのに非常に役立つライブラリがあります。スケーラブルなDP。githubで一度確認してください。