Java 在Android中滚动后,Recyclerview布局管理器将视图放置到位

Java 在Android中滚动后,Recyclerview布局管理器将视图放置到位,java,android,android-layout,android-recyclerview,Java,Android,Android Layout,Android Recyclerview,Recyclerview正在使用它的LinearLayoutManager像那样滚动lm。滚动位置带偏移量(位置,偏移量)。在滚动之前,如何获取处于滚动位置的视图?将滚动的视图在滚动后返回null,因为尚未创建。我尝试了Runnable、Observer和onLayoutCompleted但仍然为空。如何获取视图 lm.scrollToPositionWithOffset(position, offset); recyclerView.post(new Runnable(){ @Ove

Recyclerview
正在使用它的
LinearLayoutManager
像那样滚动
lm。滚动位置带偏移量(位置,偏移量)
。在滚动之前,如何获取处于滚动位置的视图?将滚动的视图在滚动后返回null,因为尚未创建。我尝试了
Runnable
Observer
onLayoutCompleted
但仍然为空。如何获取视图

lm.scrollToPositionWithOffset(position, offset);

recyclerView.post(new Runnable(){
    @Override
    public void run(){
        View v1 = recyclerView.getChildAt(position); // returning null.
        View v2 = recyclerView.getLayoutManager().getChildAt(position); // returning null.
    }
});

recyclerView.getViewTreeObserver()
   .addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
       @Override
       public void onGlobalLayout() {
           View v1 = recyclerView.getChildAt(position); // returning null.
           View v2 = recyclerView.getLayoutManager().getChildAt(position); // returning null.
       recyclerView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}});

@Override // in LinearLayoutManager
public void onLayoutCompleted(RecyclerView.State state) {
    super.onLayoutCompleted(state);
    View v1 = recyclerView.getChildAt(position); // returning null.
    View v2 = this.getChildAt(position); // returning null.  
}

如果试图修改视图内容,应执行以下操作:

  • 修改当前模型:
    itemList.get(position)//并更改
    此处用于处理该状态的任何属性

  • 调用适配器。notifyItemChanged(位置)

  • 确保您的
    ViewHolder上有正确的逻辑来处理
    这会发生变化,应该会修改您的
    视图

  • 但是,如果您真的想通过
    视图持有者
    进行更改,您也可以这样做:
    recyclerView.findViewHolderForAdapterPosition(position)
    ,然后:

    if(空!=保持器){
    holder.itemView.findviewbyd(R.id.YOUR\u id)//调用您想要的任何方法
    }


    我真的推荐第一种选择,但这取决于你。希望这对你有帮助

    RecyclerView
    在滚动时创建/重用视图-不可见的视图不存在或当前分配到不同位置,因此在布局之前尝试获取视图是不可能的。是,你说得对,但在创建滚动视图时,应该有一个侦听器用于捕获。通常,你不应该直接修改
    RecyclerView
    视图,因为它们的内部状态非常不稳定。相反,您应该修改您的数据集,调用
    adapter.notifyItemChanged(position)
    并在adapters
    onBindViewHolder(ViewHolder,position)
    中反映状态更改。为什么在滚动时需要项目的布局?当项目出现在屏幕上时,是否要更改其布局?您到底想什么时候更改布局?为什么?请提供更多详细信息,因为我想强调滚动项目。感谢回复,但持有人在屏幕外返回空值。至于您的第一个意见,我不想使用dataset exept data.thansk@plesser
    View v = lm.getChildAt(position);
    lm.scrollToPositionWithOffset(position, offset);
    v.post(new Runnable() {
        @Override
        public void run() {
            // View is ready here.                
    });