RecyclerView GridLayoutManager украшение элемента занимает измеренное пространство? - PullRequest
0 голосов
/ 04 апреля 2019

Я создаю вертикальный RecyclerView с тремя столбцами (для упрощения иллюстрации я сделал RecyclerView, содержащий только 6 элементов).То, что мне нужно, это то, что элементы по бокам получают больший запас, поэтому я использую ItemDecoration, чтобы добиться этого:

class SpaceDecoration : RecyclerView.ItemDecoration() {

    override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
        val position = parent.getChildAdapterPosition(view)
        outRect.left = when(position) {
            0, 3 -> 160 // Left most two items
            else -> 10 // others
        }
        outRect.right = when(position) {
            2, 5 -> 160 // Right most two items
            else ->0 // others
        }
        outRect.top = 10
        outRect.bottom = 0
    }
}

То, что я хочу, это чтобы тело элемента имело одинаковую ширину.Однако это не так.Похоже, что GridLayoutManager измеряет размер ItemDecoration при равном разделении пространства.Как сделать так, чтобы элементы выглядели равными по ширине?Я, конечно, не хочу, чтобы GridLayoutManager измерял ItemDecoration.enter image description here

Вот оставшийся код:

MainActivity.kt:

class MainActivity : AppCompatActivity() {
    private lateinit var recyclerView: RecyclerView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        recyclerView = findViewById(R.id.grid)
        recyclerView.layoutManager = GridLayoutManager(this,3,  RecyclerView.VERTICAL, false)
        recyclerView.adapter = GridAdapter()
        recyclerView.addItemDecoration(SpaceDecoration())
    }
}

GridAdapter.kt:

class GridAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder =
        VH(LayoutInflater.from(parent.context).inflate(R.layout.grid_item, parent, false))
    override fun getItemCount() = 6
    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) = Unit
    class VH(item: View) : RecyclerView.ViewHolder(item)
}

grid_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="48sp"
    android:text="AAA"
    android:gravity="center"
    android:background="@color/colorAccent"/>

1 Ответ

0 голосов
/ 09 апреля 2019

Вы можете просто добавить paddingLeft и paddingRight к recyclerView (без каких-либо ItemDecoration с).Там будут отступы и размер элементов будет равен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...