RecyclerView GridView 矩形自适应

最近公司要做一个类似GridView控件布局的数据展示,要求数据的item每个都是矩形的,寻思着网上找个框架用呗,

所有网上找了一个重写GridLayoutManager类的布局管理用了一下,效果不理想,太麻烦每次都要new,所以寻思着自己写了一个。

在不实现GridLayoutManager、不用new,并且只需要用布局来设置就完事而且还是自适应的矩形控件。

生气代码肯定有减少、想想都高大上,先看效果图

1.item布局代码

布局文件名:item_grid_list.xml

<?xml version="1.0" encoding="utf-8"?>
<com.dengmengxin.newproject.FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorAccent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textColor="@android:color/white"
        android:text="矩形的不信\n拿尺子量去" />
</com.dengmengxin.newproject.FrameLayout>


2.item布局效果


上面只是item布局的效果图,现在来看看item布局的根布局也就是自定义的帧布局代码吧

/**
 * @author dengmengxin
 *         Automatic Height Follower Width
 *         这里我继承系统的帧布局,当然你可以继承其它的布局,自己试下不就知道了
 */
public class FrameLayout extends android.widget.FrameLayout {
    public FrameLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public FrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public FrameLayout(Context context) {
        super(context);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //核心就是下面这块代码块啦
        int width = getMeasuredWidth();
        setMeasuredDimension(width, width);
        ViewGroup.LayoutParams lp = getLayoutParams();
        lp.height = width;
        setLayoutParams(lp);
    }
}

以上就是所有核心布局了,代码不多超简洁,以上代码告一段落大笑


现在来具体实现,当然就是最终效果咯

先上主布局代码,也就是应用打开时显示的那个界面

1.主界面 布局文件名: activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.dengmengxin.newproject.MainActivity"
    tools:showIn="@layout/activity_main">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_grid_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layoutManager="android.support.v7.widget.GridLayoutManager"
        app:spanCount="3"/>
    <!--我会告诉你还可以这样子用吗?
    app:layoutManager="android.support.v7.widget.GridLayoutManager"
    全世界的工程师都知道啦,谁用谁知道-->
</LinearLayout>

2.设置每个item间距的辅助类

/**
 * Created by Administrator on 2015/12/7.
 * 网上找的,原谅我。不想重复造轮子
 */
public class GridSpacingItemDecoration extends RecyclerView.ItemDecoration {

    private int spanCount;
    private int spacing;
    private boolean includeEdge;

    public GridSpacingItemDecoration(int spanCount, int spacing, boolean includeEdge) {
        this.spanCount = spanCount;
        this.spacing = spacing;
        this.includeEdge = includeEdge;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        int position = parent.getChildAdapterPosition(view); // item position
        int column = position % spanCount; // item column

        if (includeEdge) {
            outRect.left = spacing - column * spacing / spanCount; // spacing - column * ((1f / spanCount) * spacing)
            outRect.right = (column + 1) * spacing / spanCount; // (column + 1) * ((1f / spanCount) * spacing)

            if (position < spanCount) { // top edge
                outRect.top = spacing;
            }
            outRect.bottom = spacing; // item bottom
        } else {
            outRect.left = column * spacing / spanCount; // column * ((1f / spanCount) * spacing)
            outRect.right = spacing - (column + 1) * spacing / spanCount; // spacing - (column + 1) * ((1f /    spanCount) * spacing)
            if (position >= spanCount) {
                outRect.top = spacing; // item top
            }
        }
    }
}

3.主界面Activity的实现代码

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        RecyclerView gridView = (RecyclerView) findViewById(R.id.rv_grid_view);
        int spanCount = 3;//跟布局里面的spanCount属性是一致的
        int spacing = 5;//每一个矩形的间距
        boolean includeEdge = true;//如果设置成false那边缘地带就没有间距
        //设置每个item间距
        gridView.addItemDecoration(new GridSpacingItemDecoration(spanCount,spacing,includeEdge));
        //设置适配器
        gridView.setAdapter(new GridAdapter(this));
    }

    /**
     * 适配器
     */
    class GridAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
        private LayoutInflater mInflater;

        public GridAdapter(Context context) {
            this.mInflater = LayoutInflater.from(context);
        }

        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View rootView = this.mInflater.inflate(R.layout.item_grid_list,parent,false);
            return new ViewHolder(rootView);
        }

        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

        }

        @Override
        public int getItemCount() {
            return 9;//数据数量,不想搞太复杂
        }

        class ViewHolder extends RecyclerView.ViewHolder{
            public ViewHolder(View itemView) {
                super(itemView);
            }
        }
    }
}
没有了就这么多代码,神码你觉得代码太多了? 可怜还好吧。

来看看最后的运行效果图,不要急着关闭网页,知道有求源码的,下载地址放到最下面大笑


[资源demo下载地址](http://download.csdn.net/detail/dengmengxin/9340995)

[转载请注明出处](http://blog.csdn.net/dengmengxin/article/details/50238495)

RecyclerView是Android中非常强大的控件,它允许我们以列表的形式展示数据。但是,有时候我们需要以网格的形式展示数据,这时候我们就需要使用RecyclerViewGridView模式。 GridView模式允许我们以网格的形式展示数据,类似于Android中GridView控件的效果。GridView模式的实现方式和普通的RecyclerView有些不同,需要使用GridLayoutManager来实现。 下面是一个简单的例子,演示如何在RecyclerView中使用GridView模式: 1. 首先,在gradle文件中添加RecyclerView依赖: ``` implementation 'androidx.recyclerview:recyclerview:1.1.0' ``` 2. 在布局文件中添加RecyclerView控件: ``` <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp" app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" app:spanCount="2" /> ``` 注意,这里的layoutManager需要使用GridLayoutManager,并且需要设置spanCount属性,表示每行或每列的网格数量。 3. 创建适配器Adapter,继承自RecyclerView.Adapter: ``` class MyAdapter(private val dataList: List<String>) : RecyclerView.Adapter<MyAdapter.ViewHolder>() { class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val textView: TextView = itemView.findViewById(R.id.textView) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val itemView = LayoutInflater.from(parent.context).inflate(R.layout.item_layout, parent, false) return ViewHolder(itemView) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { val data = dataList[position] holder.textView.text = data } override fun getItemCount() = dataList.size } ``` 这里的ViewHolder中只包含一个TextView,用于展示数据。在onCreateViewHolder中创建ViewHolder实例,onBindViewHolder中将数据绑定到ViewHolder中。 4. 在Activity或Fragment中设置RecyclerView的适配器: ``` val dataList = listOf("A", "B", "C", "D", "E", "F", "G", "H", "I", "J") val recyclerView = findViewById<RecyclerView>(R.id.recyclerView) recyclerView.adapter = MyAdapter(dataList) ``` 这里的dataList是要展示的数据,可以是任意类型的列表。将数据列表传递给Adapter,然后设置到RecyclerView中。 这样,就可以在RecyclerView中展示GridView模式的数据了。如果需要修改每行或每列的网格数量,只需要修改spanCount属性即可。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值