RecyclerView.Adapter项目具有不同的layoutparams

时间:2016-02-04 15:03:58

标签: java android android-layout android-recyclerview recycler-adapter

我使用RecyclerView来显示我的数据集的元素。一切似乎都很完美,除了我有两种不同类型的项目,我希望改变每种类型的边距,以强调这种微小的差异。 为此,我使用了适配器的viewtype,但getLayoutParams()中的onCreateViewHolder(ViewGroup parent, int viewType)似乎没有给出我需要修改的正确参数。从头开始动态地重建这个参数(包括所有阴影和没有阴影)似乎没有道理。

这是我的代码:

private final static int TYPE1= 1;
private final static int TYPE2= 2;

@Override
public int getItemViewType(int position) {
    if(data_set.get(position).isType1()) {
        return TYPE1;
    }
    return TYPE2;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    // create a new view
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
    int margin = parent.getContext().getResources().getDimensionPixelSize(R.dimen.end_margin);
    if(viewType == TYPE1)
    {
        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) parent.getLayoutParams();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            params.setMarginStart(margin);
        }else{
            params.setMargins(margin,0,0,0);
        }
        v.setLayoutParams(params);
    }
    return new ViewHolder(v);
}

和heres我的xml for item_layout

<android.support.v7.widget.CardView
    android:id="@+id/item_card"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="5dp"
    android:foreground="?android:attr/selectableItemBackground"
    android:orientation="vertical"
    card_view:cardElevation="@dimen/cardview_default_elevation"
    android:clickable="true"
    card_view:cardCornerRadius="3dp"
    android:nestedScrollingEnabled="false">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layoutDirection="rtl"
        android:layout_marginEnd="20dp"
        android:layout_marginRight="20dp"
        android:orientation="horizontal">
        <ProgressBar
            android:id="@+id/img_loading"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:indeterminate="true" />
        <TextView
            android:id="@+id/tv_contact_name"
            android:gravity="end"
            android:layout_margin="5dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>

</android.support.v7.widget.CardView>

非常感谢您提供的任何指导。

2 个答案:

答案 0 :(得分:1)

当你调用parent.getLayoutParams();你正在从recyclerview获得params。

如果你想让你的xml文件中的LinearLayout参数给它一个id,并在你的代码中检索它。所以像这样:

LinearLayout myLayout = v.findViewById(R.id.mylinearlayout);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) myLayout.getLayoutParams();

//do something with parameters

myLayout.setLayoutParams(params);

答案 1 :(得分:0)

经过一些试验和错误后,我发现了一个相当奇怪的解决方案,这很可能源于我不了解RecyclerView的工作情况。 无论如何,我通过获取parent.getParent()的{​​{1}}并在修改后将其设置为视图来解决此问题。

这是修改后的代码:

CardView.LayoutParams
相关问题