实现Adapter和ViewHolder
这两个类共同定义了数据的显示方式。
ViewHolder是列表中每个元素的View的封装容器,Adapter会根据需要创建ViewHolder,还会为这些视图设置数据局,此过程称为“绑定”。
定义Adapter,需要重写下面的三个方法。
- onCreateViewHolder: 每当RecyclerView需要创建新的ViewHolder时,他都会调用此方法,此方法会创建并初始化ViewHolder以及其关联的View,但并不会填充数据。
- onBindViewHolder:RecyclerView会调动此方法将ViewHolder与数据相关联。
- getItemCount:RecyclerView会调用此方法来获取数据集的大小。
class CustomAdapter(private val dataSet: Array<String?>) :
RecyclerView.Adapter<CustomAdapter.ViewHolder>() {
// 创建ItemViewHolder 2021/7/5
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val textView: TextView
init {
textView = view.findViewById(R.id.textView)
}
}
// Create new views (invoked by the layout manager)
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder {
// Create a new view, which defines the UI of the list item
val view = LayoutInflater.from(viewGroup.context)
.inflate(R.layout.text_row_item, viewGroup, false)
return ViewHolder(view)
}
// Replace the contents of a view (invoked by the layout manager)
override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
// Get element from your dataset at this position and replace the
// contents of the view with that element
viewHolder.textView.text = dataSet[position]
}
// Return the size of your dataset (invoked by the layout manager)
override fun getItemCount() = dataSet.size
}
复制代码
以下是ViewHolder对应的布局文件示例:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:gravity="center_vertical">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="element_text"/>
</FrameLayout>
复制代码
以下是在Activity中的应用示例
class MainActivity : AppCompatActivity() {
lateinit var recyclerview:RecyclerView
protected var mRecyclerView: RecyclerView? = null
protected var mAdapter: CustomAdapter? = null
protected var mLayoutManager: RecyclerView.LayoutManager? = null
lateinit var mDataset: Array<String?>
private enum class LayoutManagerType {
GRID_LAYOUT_MANAGER, LINEAR_LAYOUT_MANAGER
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
initdataset()
mRecyclerView = findViewById(R.id.recyclerview)
mLayoutManager = GridLayoutManager(this,2)
mAdapter = CustomAdapter(mDataset)
mRecyclerView?.adapter = mAdapter
mRecyclerView?.layoutManager = mLayoutManager
}
fun initdataset(){
mDataset = arrayOfNulls(100)
for (i in 0 until 100) {
mDataset[i] = "This is element #$i"
}
}
}
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END