如何在android gridview中为行设置不同的列

mun*_* pk 34 android gridview

我想要一个类似于此的gridview

在此输入图像描述

每个奇数编号的行将有两个大尺寸的图像,偶数编号的行将有四个较小的图像.我怎样才能实现这一点?

Sul*_*ain 34

我有类似的东西,我用新的RecyclerView解决了.

我用RecyclerView创建了一个Fragment .在xml上的RecyclerView:

<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/filter_subtypes" android:layout_width="match_parent" android:layout_height="match_parent" />
Run Code Online (Sandbox Code Playgroud)

在你的片段/活动(在我的片段情况下OnViewCreated).我找到RecyclerView并设置一个Adapter-一个普通的Adapter类继承自RecyclerView.Adapter <YOUR VIEW HOLDER类> - 然后我创建一个GridLayoutManager

final GridLayoutManager mng_layout = new GridLayoutManager(this.getActivity(), TOTAL_CELLS_PER_ROW/*In your case 4*/);
Run Code Online (Sandbox Code Playgroud)


然后我重写此方法来设置动态数量的列(单元格)

mng_layout.setSpanSizeLookup( new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                switch( adapterSubtype.getItemViewType(position) ) {
                    case FilterSubtypesAdapter.TYPE_LOW:
                        return TOTAL_CELLS_PER_ROW;
                    case FilterSubtypesAdapter.TYPE_HIGH:
                        return 2;
                    default:
                        return -1;
                }
            }
        });
myRecyclerView.setLayoutManager(mng_layout);
Run Code Online (Sandbox Code Playgroud)

有了这个,您将在行上获得动态数量的单元格.

EXTRA:然后,如果您在适配器上使用相同的视图/类型视图,您将获得相同的w&h视图.您需要为TYPE_HIGH创建2个xml视图,为TYPE_LOW创建其他视图.

因此,在适配器中,您需要有2种数据(1表示高图像,1表示低图像).您必须覆盖此方法

@Override
public SubtypeViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = null;
    if (viewType==TYPE_HIGH) {
        view = inflater.inflate(R.layout.item_image_high, parent, false);
    } else {
        view = inflater.inflate(R.layout.item_image_low, parent, false);
    }
    return new SubtypeViewHolder(view, viewType);
}

 @Override
 public int getItemViewType(int position) {
     return (list.get(position).getType()==Subtype_type.HIGH) ? TYPE_HIGH : TYPE_LOW;
 }
Run Code Online (Sandbox Code Playgroud)

我希望我很清楚,任何问题都告诉我.

  • 工作!请注意,在这种情况下,getSpanSize的int结果不是spanCount,该int是默认spanCount的除法器。因此,如果您的经理中spanCount = 4,要获得一行一项,则必须返回4,要获得一行2项,则返回2,而要获得一行4项,则返回1。 (4认同)

Abh*_*hek 22

我没有考虑单个图像视图,而是将三个图像组合作为单个网格项目,

在此输入图像描述

在你的网格适配器中尝试这个

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/linear"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/green"
    android:orientation="vertical">
<ImageView
    android:id="@+id/image"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:scaleType="fitXY"
    android:src="@drawable/user"
     />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <ImageView
            android:id="@+id/image_1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:scaleType="fitXY"
            android:src="@drawable/user"

            />
        <ImageView
            android:id="@+id/image_2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:src="@drawable/user"
            android:scaleType="fitXY"
            android:layout_weight="1"
            />

        </LinearLayout>

    </LinearLayout>
Run Code Online (Sandbox Code Playgroud)

你的网格视图就像

<GridView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RelativeLayout1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:numColumns="2"
    >

</GridView>
Run Code Online (Sandbox Code Playgroud)

您唯一需要注意的是图像的顺序.可能这会对你有所帮助


Xci*_*egn 10

如果您使用RecyclerViewGridView,然后有解决方案,它应该为你工作:

GridLayoutManager layoutManager = new GridLayoutManager(this, 4);
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
    @Override
    public int getSpanSize(int position) {
         int mod = position % 6;    

         if(position == 0 || position == 1)
              return 2;
         else if(position < 6)
              return 1;
         else if(mod == 0 || mod == 1)
              return 2;
         else
              return 1;
    }
});

recyclerView.setLayoutManager(layoutManager);
Run Code Online (Sandbox Code Playgroud)

希望这对你有用!