创建一个基于位置

时间:2015-08-27 11:53:57

标签: android gridview

我想实现一个能够根据位置跨越多个行和列的网格布局。假设跨度计数为3.项目位置为零,取两行跨度和两列跨度,项目位置一取两列跨度,一行跨越项目位置二,取一列跨度和一行跨度项目位置三,取一列跨度和一行跨度

基本上我希望视图根据其位置跨越各种列和行。

我尝试使用setSpanSizeLookUp方法使用回收视图的GridLayoutManager,但它横向或纵向跨越视图。

我发现twowayview可以用于跨越多个列和行,但我不知道如何在我的项目中实现它,因为它是一个扩展的库(在android studio中设置它有问题)。

有人可以建议最佳方法吗?

1 个答案:

答案 0 :(得分:0)

在研究你的问题时,我学到了一些新东西:我碰巧看了GridLayoutManager for RecyclerView,我注意到你可以设置一个自定义的SpanSizeLookup。现在,如果你是垂直滚动,“span”只是一列,如果你是水平滚动,则只是一行。因此,SpanSizeLookup允许您指定,例如,项目0需要2列,项目1需要1列,等等。

事实证明,如果您将RecyclerView与GridLayoutManager一起使用,那么解决方案很简单:

   @Override
   protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Create a grid layout with two columns
    GridLayoutManager layoutManager = new GridLayoutManager(this, 2);

    // Create a custom SpanSizeLookup where the first item spans both 
 columns
    layoutManager.setSpanSizeLookup(new 
 GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {
            return position == 0 ? 2 : 1;
        }
    });

    RecyclerView recyclerView = (RecyclerView)  
  findViewById(R.id.recyclerview);
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setAdapter(new MyGridAdapter());
   }

关于适配器的说明:RecyclerView.Adapter与ListAdapter不兼容。您需要从RecyclerView.Adapter扩展适配器并进行适当的更改。

这是我为我的测试项目创建的适配器:

    public static class MyViewHolder extends RecyclerView.ViewHolder {

    ImageView mImageView;
    TextView mTextView;

    public MyViewHolder(View itemView) {
        super(itemView);
        mImageView = (ImageView) itemView.findViewById(R.id.imageView);
        mTextView = (TextView) itemView.findViewById(R.id.textView);
    }
   }

    public static class MyGridAdapter extends     
    RecyclerView.Adapter<MyViewHolder> {

    private int[] mDrawables;

    public MyGridAdapter() {
        this.mDrawables = new int[] {
                R.drawable.images_01,
                R.drawable.images_02,
                .
                .
                .
        };
    }

    @Override
    public int getItemCount() {
        return mDrawables.length;
    }

      @Override
      public MyViewHolder onCreateViewHolder(ViewGroup parent, int   
        viewType) {

        LayoutInflater inflater = (LayoutInflater) 
   parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.layout_grid_item, parent,  
       false);
        MyViewHolder holder = new MyViewHolder(view);
        // set up any onClickListener you need on the view here
        return holder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {

        holder.mImageView.setImageResource(mDrawables[position]);
        holder.mTextView.setText("Image " + position);
    }
   }






  Here xml of Activity


     <?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context="com.syneotek.gridlayoutmanagerdemo.Demo2">


 <android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/recyclerview">

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

 </RelativeLayout>

这是网格item_list

的xml
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:orientation="vertical"
 >


  <ImageView
    android:id="@+id/grid_item_image"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:src="@mipmap/ic_launcher" >
  </ImageView>

  <TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/text1"
    android:layout_gravity="bottom"
    android:gravity="center"
    android:textStyle="bold"
    android:textAppearance="?android:textAppearanceMedium"
    android:text="Munaf Patel"/>

 </LinearLayout>


    Best of Luck.