带有偶数项目的LinearSnapHelper问题

时间:2019-10-01 14:54:26

标签: android android-recyclerview

我想使用RecyclerView来实现一个水平列表,以实现以下目标:

Sample List(Taken from Google Play store)

图像取自Google Play商店 Sample List(Taken from Google Play store)

我的意思是,任何滚动之后,我们有3个(或更多)完全可见的项目和2个部分可见的项目。 这是我的代码:

MainActivity:

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)
    }

  }
}

MainActivity布局

<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>

MyAdapter:

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>

结果是完美的:

Perfect Result

但是问题是,当您将可见项的数量设置为偶数(例如4)时:

class MyAdapter : RecyclerView.Adapter<MyAdapter.ViewHolder>() {

private val numberOfVisibleItem = 3.4

...
}

Unexpected result

现在我们有两个问题!首先,我们不能再次滚动到第一项,而第二个问题是,我们有3个完全可见的项目和2个大部分可见的项目,但是我需要4个完全可见的项目和2个部分可见的项目。

0 个答案:

没有答案