我想使用RecyclerView来实现一个水平列表,以实现以下目标:
我的意思是,任何滚动之后,我们有3个(或更多)完全可见的项目和2个部分可见的项目。 这是我的代码:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
list.apply {
layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
adapter = MyAdapter()
LinearSnapHelper().attachToRecyclerView(this)
}
}
}
<FrameLayout 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">
<androidx.recyclerview.widget.RecyclerView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:clipToPadding="false"
android:orientation="horizontal"
android:paddingStart="16dp"
android:paddingEnd="16dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:itemCount="10"
tools:listitem="@layout/item_sample" />
</FrameLayout>
class MyAdapter : RecyclerView.Adapter<MyAdapter.ViewHolder>() {
private val numberOfVisibleItem = 3.4
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder =
ViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.item_sample, parent, false)
.apply { setItemSize(this) })
private fun setItemSize(view: View?) {
val displayMetrics = view!!.context.resources.displayMetrics
val itemSize =
(displayMetrics.widthPixels / numberOfVisibleItemItem).toInt()
val layoutParams = view.layoutParams
layoutParams.height = itemSize
layoutParams.width = itemSize
view.layoutParams = layoutParams
}
override fun getItemCount(): Int = 20
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.itemView.title.text = "Item $position"
}
class ViewHolder(view: View) : RecyclerView.ViewHolder(view)
}
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_margin="8dp"
android:background="@color/colorAccent"
android:gravity="center"
android:padding="8dp"
android:text="Item"
android:textColor="@android:color/white" />
</FrameLayout>
但是问题是,当您将可见项的数量设置为偶数(例如4)时:
class MyAdapter : RecyclerView.Adapter<MyAdapter.ViewHolder>() {
private val numberOfVisibleItem = 3.4
...
}
现在我们有两个问题!首先,我们不能再次滚动到第一项,而第二个问题是,我们有3个完全可见的项目和2个大部分可见的项目,但是我需要4个完全可见的项目和2个部分可见的项目。