ListView行在自定义适配器中以编程方式设置左边距

时间:2014-01-17 12:58:29

标签: android listview android-adapter layoutparams

我有一个ListView及其自定义适配器。

在适配器的getview中,我想将15个dip的左边距设置为某些行。基于某些条件。

  -----------------------------
 |  Row 1 (margin 15dip)       |
  -----------------------------

  -----------------------------
 |  Row 2 (margin 15dip)       |
  -----------------------------

       -----------------------------
      |  Row 2.1 (margin 30dip)     |
       -----------------------------

             -----------------------------
            |  Row 2.1.1 (margin 45dip)   |
             -----------------------------

  -----------------------------
 |  Row 3 (margin 15dip)       |
  -----------------------------

但是当我使用以下代码设置保证金时,它会给出ClassCastException

  

01-17 18:19:35.467:E / AndroidRuntime(14165):   java.lang.ClassCastException:android.widget.FrameLayout $ LayoutParams   无法强制转换为android.widget.AbsListView $ LayoutParams

行布局

<?xml version="1.0" encoding="utf-8"?>
 <FrameLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/parentframeLayout"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_marginLeft="10dip"
 android:layout_marginRight="10dip" >

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="40dip"
    android:background="@color/alphaBlueMariner"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    android:paddingLeft="10dip" >

    <ImageView
        android:id="@+id/offlineImageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:src="@drawable/ic_object_offline" />

    <ImageView
        android:id="@+id/parentImageView"
        android:layout_width="@dimen/small_indicator_icon_square"
        android:layout_height="@dimen/small_indicator_icon_square"
        android:layout_marginLeft="5dip"
        android:src="@drawable/ic_arrow_right" />

    <TextView
        android:id="@+id/tvParentName"
        style="@style/TextViewMedStyleShadowBlack"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="20dip" />
</LinearLayout>

</FrameLayout>
我的getView方法中的

示例

   Log.i("LayoutParams","1");
            // setting left margin
            FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
                    FrameLayout.LayoutParams.MATCH_PARENT,      
                    FrameLayout.LayoutParams.WRAP_CONTENT
                    );

            Resources r = context.getResources();

            int px = (int) TypedValue.applyDimension(
                    TypedValue.COMPLEX_UNIT_DIP,
                    15, 
                    r.getDisplayMetrics()
                    );

            if(requirementModel.getParentId() == 0)
            {

                params.setMargins(px, 0, 0, 0);

                parentFrameLayout.setLayoutParams(params);

            }
            else
            {

                params.setMargins(px+px, 0, 0, 0);

                parentFrameLayout.setLayoutParams(params);

            }
            parentFrameLayout.requestLayout();

}

return row;

此代码运行但在

时崩溃
  

返回行;

请帮忙。谢谢:))

3 个答案:

答案 0 :(得分:9)

ListView期望不支持边距的AbsListView.LayoutParams。尝试在LinearLayout对象而不是FrameLayout上设置边距。或者在FrameLayout上使用填充。

答案 1 :(得分:0)

我怀疑是因为LayoutParams不是LinearLayout类型。你能试试吗?

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,      
                LinearLayout.LayoutParams.WRAP_CONTENT
                );

答案 2 :(得分:0)

如果您想在完整视图中设置边距但是可以按照其他人的建议设置单个项目边距,您可以将列表视图参数转换为并执行您的工作

ViewGroup.MarginLayoutParams marginLayoutParams = (ViewGroup.MarginLayoutParams) mListView
        .getLayoutParams();

marginLayoutParams.setMargins(leftMargin, topMargin, righttMargin, bottomMargin);