仅当RecyclerView可滚动时,才如何在RecyclerView的最后一个视图中添加填充?

时间:2018-09-27 21:21:35

标签: java android android-recyclerview

我想在RecyclerView的最后一个视图中添加底部填充,但如果RecyclerView可滚动,则-换句话说,如果最后一个适配器项完全可见而没有滚动,不要添加填充。我意识到,在onBindViewHolder中,findLastCompletelyVisibleItemPosition()将始终返回上一项的位置,因为当前视图在技术上尚不可见。我还尝试了ItemDecorator,但这也不起作用,因为它们是在视图之前添加的,因此我们仍然不知道RecyclerView是否可滚动。我理想的方法如下所示:

@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
    ...
    if (position == items.size() - 1 && [is scrollable]) {
        ((MyViewHolder) viewHolder).addBottomPadding(...);
    }
}

我不确定那是[可滚动的]位。还有另一种方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:1)

好的,那么我为您提供解决方案:)。 核心概念是将viewTreeObserver OnGlobalLayoutListener附加到onBind的最后一项。然后,在对视图进行度量之后,将调用其OnGlobalLayout方法,这对您的要求至关重要。调用后,只需计算y + itemViewHeight并将其与height of the RecyclerView进行比较。为了达到这个高度,您还必须在RecyclerView上附加一个OnGlobalLayoutListener,然后设置Adapter with the height of it as parameter。您可能需要在调用onGobalLayout之前设置一个“空”适配器,以防止发生错误。

要记住的两个重要事项:

-永远不要忘记删除OnGlobalLayoutListener
 -- 下面的代码是    丑陋且仅是最小的可行产品

活动:

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    rvTest.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
    //maybe an adapter without content has to be provided so you won't get the error: no adapter attached skipping layout
    rvTest.viewTreeObserver.addOnGlobalLayoutListener(object: ViewTreeObserver.OnGlobalLayoutListener {
        override fun onGlobalLayout() {
            rvTest.adapter = RvTestAdapter(this@MainActivity, rvTest.height)
            rvTest.viewTreeObserver.removeOnGlobalLayoutListener(this) //must remove! 
        }

    })
}
}

适配器:

class RvTestAdapter(val context: Context, val recyclerViewHeight: Int): RecyclerView.Adapter<TestViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = TestViewHolder(LayoutInflater.from(context).inflate(R.layout.vh_test, parent, false))

    override fun getItemCount() = 3

    override fun onBindViewHolder(holder: TestViewHolder, position: Int) {
        if (position == 2) { //last position
            holder.itemView.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
                override fun onGlobalLayout() {
                    if (holder.itemView.y + holder.itemView.height  > recyclerViewHeight) {
                        Log.d("YESSSS", "WOOP WOOP")
                    }

                    holder.itemView.viewTreeObserver.removeOnGlobalLayoutListener(this)
                }

            })
        }
    }

}

(希望您不介意Kotlin代码)

答案 1 :(得分:0)

在视图中添加 android:clipToPadding 属性,并为将与recylerview项一起滚动的视图添加填充。

  <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clipToPadding="false"
        android:paddingBottom="16dp"
        android:paddingTop="16dp"
     />

希望这会有所帮助