Android初步进阶之RecyclerView的使用(一)
使用RecyclerView实现GridView 在活动中改变布局格式。 import android.app.Activity import android.os.Bundle import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import android.widget.Toast import androidx.recyclerview.widget.DefaultItemAnimator import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.StaggeredGridLayoutManager import java.util.* import kotlin.collections.ArrayList class MainActivity : Activity(){ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main_activity) val data = ArrayList<String>() data.add("测试") data.add("再测") data.add("春绮美空") data.add("测试") data.add("再测") data.add("春绮美空") //设置列表 val list:RecyclerView = findViewById(R.id.recyclerview) val params = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) //这里设置为GridView布局 val gridLayoutManager = StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.VERTICAL) list.layoutManager = gridLayoutManager list.layoutParams = params list.itemAnimator = DefaultItemAnimator() val adapter:HomeAdapter = HomeAdapter(data, this) //设置分割线 val decoration:DividerItemDecoration = DividerItemDecoration() decoration.DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST) list.addItemDecoration(decoration) adapter.setOnItemClickListener(object :HomeAdapter.OnItemClickListener{ override fun onItemClick(view: View, position: Int) { Toast.makeText(this@MainActivity, "单击第${position+1}条", Toast.LENGTH_SHORT).show() } }) list.adapter = adapter } } 按照之前第一篇其他部分不变就可以,之后,就会发现分割线不正确了,我们修改一下分割线类 import android.content.Context import android.content.res.TypedArray import android.graphics.Canvas import android.graphics.DrawFilter import android.graphics.Rect import android.graphics.drawable.Drawable import android.view.View import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import java.text.AttributedString class DividerItemDecoration : RecyclerView.ItemDecoration() { companion object { fun get():IntArray{ val res = IntArray(1) res[0] = android.R.attr.listDivider return res } var ATTRS = get() val HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL val VERTICAL_LIST = LinearLayoutManager.VERTICAL } private var mDivider: Drawable? = null private var mOrientation:Int = 0 /** * 初始化 */ public fun DividerItemDecoration(context: Context, orientation:Int){ val a:TypedArray = context.obtainStyledAttributes(ATTRS) mDivider = a.getDrawable(0) a.recycle() setOrientation(orientation) } /** * 设置布局 */ public fun setOrientation(orientation:Int){ if(orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST){ throw IllegalArgumentException("无效布局") } mOrientation = orientation } override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) { if(mOrientation == VERTICAL_LIST){//这里有修改 drawVertical(c, parent) drawHorizontal(c, parent) }else{ drawHorizontal(c, parent) drawVertical(c, parent) } } /** * 绘制纵向布局分割线 */ fun drawVertical(c:Canvas, parent:RecyclerView){ val childCount:Int = parent.childCount for(i in 0 until childCount){ val child: View = parent.getChildAt(i) //这里改一下 val left:Int = parent.paddingLeft + child.left val params:RecyclerView.LayoutParams = RecyclerView.LayoutParams(child.layoutParams) val right:Int = child.right - params.rightMargin val top:Int = child.bottom + params.bottomMargin val bootom:Int = top + mDivider!!.intrinsicHeight mDivider!!.setBounds(left, top, right, bootom) mDivider!!.draw(c) } } /** * 绘制横向布局分割线 */ fun drawHorizontal(c:Canvas, parent: RecyclerView){ val childCount:Int = parent.childCount for(i in 0 until childCount){ val child:View = parent.getChildAt(i) val top:Int = parent.paddingTop val params:RecyclerView.LayoutParams = RecyclerView.LayoutParams(child.layoutParams) //这里改一下 val bottom:Int = child.bottom - params.bottomMargin val left:Int = child.right + params.rightMargin val right:Int = left + mDivider!!.intrinsicWidth mDivider!!.setBounds(left, top, right, bottom) mDivider!!.draw(c) } } override fun getItemOffsets( outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State ) { super.getItemOffsets(outRect, view, parent, state) if(mOrientation == VERTICAL_LIST){ outRect.set(0, 0, 0, mDivider!!.intrinsicHeight) }else{ outRect.set(0 , 0 , mDivider!!.intrinsicWidth, 0) } } } 效果如下 之前,也提到了,这个组件比较灵活,因此,可以用来实现瀑布式布局。 首先,为了看得清楚我们在子项布局中,加上layout_margin=“2dp”。修改适配器中的 onBindViewHolder()函数,在里面加上: val lp:ViewGroup.LayoutParams = holder.tv.layoutParams lp.height = 100 + (Math.random() * 300).toInt() holder.tv.layoutParams = lp 效果 如果,有帮助,点个赞吧!!!@A@