AA_*_*_PV 10 android horizontallist android-recyclerview
我打算实现的目标
项目视图应占据项目的整个高度
可能是项目高度小于recyclerview中最高项目的高度,在这种情况下,它应该像上面的屏幕截图中那样粘在顶部.
我遇到的错误
如上面的屏幕截图所示,视图被截断.
到目前为止我尝试过的
最初我在recyclerview上使用wrap_content,现在它已得到支持.当当时在屏幕上看不到的任何视图都是最高的时候,它不起作用.这对视图层次结构的布局有意义.如果高度取决于该数据,如何计算甚至没有绑定到任何数据的东西的高度?
解决时间:S
我没有尝试自定义布局管理器,而是首先选择了我认为需要完成的工作 - 在开始时列出所有项目视图以确定它们的高度.
在屏幕的上半部分有一个进度条和一个动画,以吸引用户的注意力,而这一切都发生在recyclelerview可见性被设置为不可见的情况下.我使用了两件事,一件是不够的 - 我在适配器的onViewAttached()调用中附加了一个观察者,我也使用了滚动更改监听器.有一个LinearSnapHelper附加到回收器视图,以捕捉到滚动的相邻(下一个或上一个,取决于滚动方向)位置.
在此设置中,
layoutManager.smoothScrollToPosition()使用获取子视图高度
View currentChildView = binding.nextRv.getChildAt(layoutManager.findFirstCompletelyVisibleItemPosition());
if (currentChildView != null) {
currentChildHeight = currentChildView.getHeight();
}
Run Code Online (Sandbox Code Playgroud)在滚动更改侦听器中RecyclerView.SCROLL_STATE_IDLE或通过将高度传递给适配器的onViewAttachedToWindow()中上面提到的视图附加观察器
@Override
public void onViewAttachedToWindow(BindingViewHolder holder) {
if (mObserver != null) {
mObserver.onViewAttached(holder.binding.getRoot().getHeight());
}
}
Run Code Online (Sandbox Code Playgroud)
maxHeight更改为maxHeight和新子高度的最大值.很明显,这很难看.另外它并没有给我当前视图的高度 - onAttached意味着它只是附加,而不是测量和布局.它是循环视图,而不是绑定到当前数据项的视图.这会出现如上所示的截断视图等问题.
我还在回收器视图上尝试了wrap_content高度,并从回收器的父进程中失效,直到回收器和滚动子进入SCROLL_STATE_IDLE.不行.
我不确定自定义布局管理器如何在这里提供帮助.
有人能引导我朝正确的方向发展吗?
我无法接受@Pradeep Kumar Kushwaha 的回答,因为针对一种解决方案,我不希望列表中的字体大小不同。一致性是设计的关键要素。他给出的第二个选择不起作用,因为使用 ellipsize 我需要提供某种“更多”按钮让用户阅读整个内容,而我的文本视图已经在执行单击操作。把更多的地方放在其他地方也不是好的设计。
当最高的、被截断的项目成为焦点时,通过调整 recyclerview 大小的简单折衷来改变设计,它变成了 notifyItemChanged() 的简单用例。即使我尝试使用附加视图的观察者和滚动状态侦听器,也可以使用 notifyItemChanged,但这种方法太老套了。这在代码和设计中我都可以接受。这是所需的代码。
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
int position = ((LinearLayoutManager) binding.nextRv.getLayoutManager())
.findFirstVisibleItemPosition();
if (position != nextSnippetAdapter.getItemCount() - 1) {
binding.nextRv.getAdapter().notifyItemRangeChanged(position, 2);
} else {
binding.nextRv.getAdapter().notifyItemChanged(position);
}
}
}
Run Code Online (Sandbox Code Playgroud)
对于我的特定设置,只需调用这两个元素即可。它可以进一步优化,以便position + 1在大多数情况下调用单个元素,并在角落(文字)情况下检查和调用适当的元素。
在您的适配器内,我可以找到两张卡,一张在顶部,另一张在底部
我如何定义我的布局是这样的:
Cardview1
LinearLayout1 --> orientation vertical
cardview2 (Top card where text is written)
Linearlayout2 (where I can see icons such as like etc)-->orientation horizontal
Run Code Online (Sandbox Code Playgroud)
现在通过将 Linearlayout2 设置为换行内容来修复 Linearlayout2 的高度。
并且cardview2的高度应该是0dp并添加权重= 1
现在在cardview2中添加一个TextView1以匹配parent的高度和宽度。
更好的是在 textview1 内部添加椭圆形到末尾并添加最大行数
如果你想显示所有行,请尝试查找 autoresizetextview 库,可以在此处找到它 --> AutoResizeTextView
希望能帮助到你。
| 归档时间: |
|
| 查看次数: |
2161 次 |
| 最近记录: |