如何从线性布局管理器访问新添加的视图
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 方法调用之前没有办法测量视图的高度。以上是关于如何从线性布局管理器访问新添加的视图的主要内容,如果未能解决你的问题,请参考以下文章
android常用的布局管理器都有哪些,简述各布局管理器的布局特点