Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仅当RecyclerView可滚动时,如何向RecyclerView中的最后一个视图添加填充?_Java_Android_Android Recyclerview - Fatal编程技术网

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

Java 仅当RecyclerView可滚动时,如何向RecyclerView中的最后一个视图添加填充?,java,android,android-recyclerview,Java,Android,Android Recyclerview,我想在RecyclerView中的最后一个视图中添加底部填充,但只有当RecyclerView可滚动时才添加底部填充,换句话说,如果最后一个适配器项完全可见且没有滚动,则不要添加填充。我意识到在onBindViewHolder中,findLastCompletelyVisibleItemPosition()将始终返回上一个项目的位置,因为当前视图在技术上还不可见。我还尝试了一个ItemDecorator,但这也不起作用,因为它们是在视图之前添加的,所以我们仍然不知道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(...);
    }
}

那个[可滚动]位是我不确定的。有没有其他方法可以做到这一点?

好的,我有一个解决方案给你:)。 核心概念是在
onBind
中的最后一项附加
viewTreeObserver-OnGlobalLayoutListener
。然后,在对视图进行度量之后,将调用它的
OnGlobalLayout
方法,这对于您的需求至关重要。调用后,只需计算
y+itemViewHeight
,并将其与RecyclerView的
高度进行比较。要获得此高度,还必须将
OnGlobalLayoutListener
附加到RecyclerView,然后将
适配器的高度设置为参数。在调用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)
                }

            })
        }
    }

}
class-RvTestAdapter(val-context:context,val-recyclerViewHeight:Int):RecyclerView.Adapter(){
覆盖fun onCreateViewHolder(父级:ViewGroup,viewType:Int)=TestViewHolder(LayoutFlater.from(上下文)。充气(R.layout.vh_测试,父级,假))
重写getItemCount()=3
覆盖BindViewHolder(holder:TestViewHolder,位置:Int){
如果(位置==2){//最后一个位置
holder.itemView.viewTreeObserver.addOnGlobalLayoutListener(对象:viewTreeObserver.OnGlobalLayoutListener{
覆盖Loballayout(){
if(holder.itemView.y+holder.itemView.height>RecycleServiceWheight){
Log.d(“yesss”,“WOOP-WOOP”)
}
holder.itemView.viewTreeObserver.removeOnGlobalLayoutListener(此)
}
})
}
}
}

(希望您不介意Kotlin代码)

为您的视图添加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"
     />


希望这会有所帮助

不确定这是否有效,但您可以尝试使用
boolean scrollable=canscrollvertical(-1)| | canscrollvertical(1)
很高兴我能帮助您