如何从线性布局管理器访问新添加的视图

Posted

技术标签:

【中文标题】如何从线性布局管理器访问新添加的视图【英文标题】:How to Access newly added view from linearlayout manager 【发布时间】:2016-11-13 08:31:51 【问题描述】:

我正在制作一个聊天应用程序。 我有一个扩展 LinearLayoutManager 的布局管理器,我想计算添加到适配器的视图的高度,以便当我调用 smoothScrollToPosition() 时,我可以更改滚动速度。

对于更高的高度,我会将 MILLISECONDS_PER_INCH 设置为更小的值,对于更小的高度,我会将其设置为大。

但我无法计算新添加的视图的高度。

public class SmoothLinearLayoutManager extends LinearLayoutManager 

private ChatAdapter mChatAdapter;
private Context mContext;
private final float MILLISECONDS_PER_INCH = 250f;
public SmoothLinearLayoutManager(Context context,ChatAdapter adapter) 
    super(context);
    mContext = context;
    mChatAdapter = adapter;


public SmoothLinearLayoutManager(Context context, int orientation, boolean reverseLayout) 
    super(context, orientation, reverseLayout);
    mContext = context;


public SmoothLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) 
    super(context, attrs, defStyleAttr, defStyleRes);
    mContext = context;


@Override
public void smoothScrollToPosition(final RecyclerView recyclerView, RecyclerView.State state, final int position) 

    Log.d("Scroll",mChatAdapter.getChildHeight()+"");

    LinearSmoothScroller smoothScroller = new LinearSmoothScroller(mContext) 
        @Override
        public PointF computeScrollVectorForPosition(int targetPosition) 
            return SmoothLinearLayoutManager.this.computeScrollVectorForPosition(position);
        

        @Override
        protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) 
            return (MILLISECONDS_PER_INCH)/displayMetrics.densityDpi;
        
    ;
    smoothScroller.setTargetPosition(position);
    startSmoothScroll(smoothScroller);

【问题讨论】:

【参考方案1】:

如果您访问新添加的视图的目的是使平滑滚动速度保持恒定,那么这个库可能对您有用。https://github.com/nshmura/SnappySmoothScroller

像这样:

layoutManager = new SnappyLinearLayoutManager(context);
layoutManager.setSnapDuration(500);
layoutManager.setSeekDuration(1000);

【讨论】:

这将对所有人保持恒定的速度,新添加的视图最初是不可见的,因为它在底部,我必须滚动到那个位置,现在因为它不可见,它不在onBindView ,所以我的问题是我们是否可以测量新添加的不可见视图的高度? 新增视图的高度在View#onMeasure方法中确定。 View#onMeasure 方法在 RecyclerView.Adapter#onBindView 方法调用之后被调用。所以我认为在 RecyclerView.Adapter#onBindView 方法调用之前没有办法测量视图的高度。

以上是关于如何从线性布局管理器访问新添加的视图的主要内容,如果未能解决你的问题,请参考以下文章

是否可以为不同的视图类型更改布局管理器?

obiee 11g 使用目录管理器提取分析的布局和视图

android中常用的布局管理器

android常用的布局管理器都有哪些,简述各布局管理器的布局特点

Android布局管理器-使用LinearLayout实现简单的登录窗口布局

Android LinearLayout线性布局详解