2013-06-14 6 views
5

私はリストビューを使用するAndroidアプリケーションを作成していました。 ListViewは、CheckedTextViewリスト項目で構成されます。私のアクティビティには、上部にEditText、下部にTextView、下部にButtonがあります。 TextViewとボタンの間のスペースは、ListViewが占める領域です。今、私のListViewはかなり少ない項目が含まれているので、ListViewのスペース全体が占有されていません。また、残されたスペースは明らかにデバイスによって異なります。私が知りたいのは、ListViewの行の高さを変更してListViewに割り当てられたスペース全体をカバーする方法があるかどうかです。また、アイテムを追加する必要が生じた場合、行の高さはそれに応じて調整されることがあります。 以下のコードスニペットをいくつか用意していますので、レイアウトがどのようなものか分かりやすくなっています。リストビューの行の高さをリストアイテムの数に基づいて動的に変更します

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:background="#D0D0D0" 
tools:context=".MainActivity" > 

<Button 
    android:id="@+id/addcourse" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_centerHorizontal="true" 
    android:text="Add Course" /> 

<EditText 
    android:id="@+id/coursenameet" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:ems="10" 
    android:layout_marginBottom="2dp" 
    android:layout_marginTop="2dp" 
    android:hint="Course Name" 
    android:inputType="textCapWords" > 

    <requestFocus /> 
</EditText> 

<View 
    android:id="@+id/divider" 
    android:layout_width="match_parent" 
    android:layout_height="3dp" 
    android:layout_below="@+id/coursenameet" 
    android:layout_marginBottom="5dp" 
    android:layout_marginTop="5dp" 
    android:background="@android:color/darker_gray" > 
</View> 

<TextView 
    android:id="@+id/weekdaytv" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/divider" 
    android:layout_marginBottom="3dp" 
    android:layout_marginTop="3dp" 
    android:layout_centerHorizontal="true" 
    android:text="Select weekdays for this Course" > 
</TextView> 

<ListView 
    android:id="@+id/listView1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_above="@+id/addcourse" 
    android:layout_below="@+id/weekdaytv" 
    android:divider="#FFFFFF" 
    android:dividerHeight="2px"> 

</ListView> 

</RelativeLayout> 

activity_main.xml

項目はBaseAdapterを使用して実装さCheckedTextViewsあります。あなたはXMLでのListView属性を設定することができ、全体のスペースが割り当てられた埋めるためにあなたのListViewを設定するには、メインの活動

lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
    adapter = new ItemsAdapter(MainActivity.this, weekdays, 6, lv.getBottom() - lv.getTop()); 
    lv.setAdapter(adapter); 

    lv.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
       long arg3) { 
      CheckedTextView ctv = (CheckedTextView) arg1; 
      adapter.toggle(ctv); 
     } 
    }); 
+0

適切な解決策はありますか? –

答えて

0

からの抜粋:BaseAdapterクラスの表示方法は、

public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    int colorpos = position % colors.length; 
    if(v == null){ 
     LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.listviewitem, null); 
    } 
    CheckedTextView newrow = (CheckedTextView) v.findViewById(R.id.checkedtextview); 
    v.setBackgroundColor(colors[colorpos]); 
    newrow.setTextColor(Color.BLACK); 
    newrow.setText(items[position]); 
    return v; 
} 

EDITある

android:fillViewport=”true” 

またはコード:

myListView.setFillViewport(true); 

セルのサイズを変更する場合は、ViewParamsを設定して計算することができます。例えば、単一セルのために、あなたが使用することができます。

int n = /* number of cells */ 3; 
int height = (myListView.getBottom() - myListView.getTop()); 
AbsListView.LayoutParams params = new AbsListView.LayoutParams(AbsListView.LayoutParams.FILL_PARENT, height/n); 
v.setLayoutParams(params); 
+0

これはエラーを出します: - 要素タイプ "ListView"に関連付けられた属性 "android:fillViewport"に対してオープンクォートが必要です。 助けてください。 – tintin

+0

答えの最後の行にmyCellとは何ですか?私は自分のコードに対応する価値がありません。これがメインアクティビティか、私が持っているBaseAdapterクラスで行われるかどうか教えてください。 – tintin

+0

@ tintin、変数vを使用するようにコードを更新します。 – Phil

11

こんにちは、クラスを作成します。

AbsListView.LayoutParams params = new AbsListView.LayoutParams(AbsListView.LayoutParams.FILL_PARENT, AbsListView.LayoutParams.FILL_PARENT); 
v.setLayoutParams(params); 

についてはn個細胞を、あなたはあなたのListViewのサイズに基づいて垂直方向のサイズを計算することができますこのように

public class Utility { 

    public static void setListViewHeightBasedOnChildren(ListView listView) { 
     ListAdapter listAdapter = listView.getAdapter(); 
     if (listAdapter == null) { 
      // pre-condition 
      return; 
     } 

     int totalHeight = 0; 
     int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST); 
     for (int i = 0; i < listAdapter.getCount(); i++) { 
      View listItem = listAdapter.getView(i, null, listView); 
      listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED); 
      totalHeight += listItem.getMeasuredHeight(); 
     } 

     ViewGroup.LayoutParams params = listView.getLayoutParams(); 
     params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 
     listView.setLayoutParams(params); 
     listView.requestLayout(); 
    } 


} 

このメソッドは、リストビュー内の行の高さを動的に変更したい場合に呼び出します。

Utility.setListViewHeightBasedOnChildren(YourListView); 

続きを読むReference ..これがあなたを助けてくれることを願っています。まだ

listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED); 

でエラーを得た人のために

+0

BaseAdapterクラスの行の表示を宣言しました。これがどうなるのか正確に教えてください。 また、次のようにアダプタを設定しています。 - lv.setAdapter(adapter); 私はこのメソッドをその直後に呼び出すことになっていますか?私は現在行数を固定しており、現時点では行を追加していないと仮定します。 – tintin

+1

その方法でリストビューを宣言するだけです。それはあなたに何をしたいのかを正確に教えてくれるでしょう。 – Nirmal

+0

本当に申し訳ありませんが、私はあなたを理解していません。私は自分の質問を編集し、正確に私が何をしているかを見るための主要な活動コードのスニペットを入れました。方法をどこに呼び出すべきかを提案する。 – tintin

0

このように、これらのコード行を記述します。

IF(のViewGroupのinstanceof listItemの)

listItem.setLayoutParams(新しいLayoutParams(LayoutParams.WRAP_CONTENT、LayoutParams.WRAP_CONTENT))。

 listItem.measure(0, 0); 
関連する問題