- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我今天有一个很奇怪的问题:我有一个水平显示一些缩略图的 RecyclerView,我使用 smoothScrollToPosition
导航到我需要的项目,但我注意到一个问题:它不会滚动到最后一项。进一步调试后,我发现我的 recyclerview 的子项比它显示的要少!我看到五个项目,一次显示 3 个。但是 child 计数(通过 recyclerView.getChildCount
获得)返回 4 而不是 5,我无法通过 getChildAt(4)
获得最后一个 child 。更奇怪的是,adapter.getItemCount()
返回 5,而 recyclerView.getAdapter().getItemCount()
返回 5...
检查 layoutAdapter
后,recyclerView.getLayoutManager().getItemCount()
返回 5,`recyclerView..getLayoutManager().getChildCount() 返回 4.. .
我需要两件事:首先,我需要我的 recyclerView 滚动到最后一项,其次:我需要能够获取所有子项,因为我对它们做了一些修改,因为用户与项目互动。
部分代码:
// Scrolling and editing the item inside the recyclerView
// It doesn't scroll to position 4, even having a item there...
mLayoutManager.smoothScrollToPosition(recyclerView, null, position);
// the code bellow returns null if position = 4, even if the recyclerView adapter has a item at index 4, and it is visible...
ImageView iv = (ImageView) recyclerView.getChildAt(position);
if (iv != null) {
iv.setPadding(10, 10, 10, 10);
iv.setBackgroundColor(getResources().getColor(R.color.colorPrimaryDark));
ImageView ivo = (ImageView) recyclerView.getChildAt(position - 1);
if (position - 1 == 0) {
ivo.setPadding(10, 10, 10, 10);
} else {
ivo.setPadding(0, 10, 10, 10);
}
ivo.setBackgroundColor(getResources().getColor(R.color.transparent));
}
smoothScrollToPosition 实现:
public class SnappingLinearLayoutManager extends LinearLayoutManager {
private static final float MILLISECONDS_PER_INCH = 150f;
public SnappingLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
}
@Override
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state,
int position) {
RecyclerView.SmoothScroller smoothScroller = new TopSnappedSmoothScroller(recyclerView.getContext()){
@Override
public PointF computeScrollVectorForPosition(int targetPosition) {
return new PointF(0, 1);
}
//This returns the milliseconds it takes to scroll one pixel.
@Override
protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
return MILLISECONDS_PER_INCH / displayMetrics.densityDpi;
}
};
smoothScroller.setTargetPosition(position);
startSmoothScroll(smoothScroller);
}
private class TopSnappedSmoothScroller extends LinearSmoothScroller {
public TopSnappedSmoothScroller(Context context) {
super(context);
}
@Override
public PointF computeScrollVectorForPosition(int targetPosition) {
return SnappingLinearLayoutManager.this
.computeScrollVectorForPosition(targetPosition);
}
@Override
protected int getVerticalSnapPreference() {
return SNAP_TO_ANY;
}
}
}
最佳答案
1) 要滚动到列表中的某个位置,您可以使用 scrollToPosition(position)
.您传入的位置将是最后一项的索引,如下所示:
recyclerView.smoothScrollToPosition(adapter.getItemCount())
我能够使用 v7 RecyclerView 和 android 的 LinearLayoutManager 使用这种方法。
构建.gradle
...
dependencies {
...
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:recyclerview-v7:23.4.0'
...
}
RecyclerView布局代码:
<android.support.v7.widget.RecyclerView android:id="@+id/item_list"
android:name="fbalashov.spikeapp.ItemListFragment"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="LinearLayoutManager" />
然后当我想滚动到列表的顶部时,我只需调用我的 scrollToBottom 方法:
private void scrollToBottom() {
recyclerView.smoothScrollToPosition(recyclerView.getAdapter().getItemCount());
}
这会导致 RecyclerView 平滑地滚动到列表中的最后一项。
2) 正如 Rafal 所说,RecyclerView(和 ListView)仅绘制屏幕上可见的项目 + 顶部和底部的一个或两个缓冲区以使滚动看起来不错。当您滚动时,它将“回收” View 并使用来自您的适配器的数据填充它们。因此,滚动到顶部的 View 将在列表底部重新使用,数据来自下一个项目。
因此,您无法同时获取适配器中项目的所有 View 。但是,您可以获取适配器中的所有项目,修改它们,然后触发适配器使用 adapter.notifyDataSetChanged() 重绘 recyclerView 中的 View 。 .示例:
// getItems() is a method you will have to add to you adapter to get the items from your
// adapter. Otherwise you can add a method in your adapter to update the items.
List<DataType> items = adapter.getItems();
for (DataType item : items) {
// make some change to each item
}
// this will force the recycler view to redraw its views
adapter.notifyDataSetChanged();
您还可以通过更新适配器中的项目并使用 notifyItemChanged(position) 对适配器中的项目进行更有针对性的更改。 .
关于android - RecyclerView Children 计数小于 children 数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38536755/
问题:如果联接表的属性大于/小于值,是否可以在散列条件下进行测试 例如:测试 Actor 年龄是否大于年龄变量: 是否可以写而不是 ARRAY CONDITION 的: ageVariable = 3
这个问题已经有答案了: How to check if a number is between two values? (12 个回答) 已关闭 6 年前。 我目前正在 Codecademy 上学习
我想知道是否有一种方法可以比较 arrayList 中的连续元素。我有这个 for (int j=0; j< Index.size(); j++) { if(Index.get(j) < Ind
我正在压缩一些代码,现在我有 4 种方法,它们几乎都做同样的事情,除了 for 循环的建模有点不同。我正在传递 int 的 up , down , right ,和left作为这个紧凑方法的参数,这与
SELECT DISTINCT s.sname, s.sid FROM student s, class c WHERE s.programme = 'CS' AND s.level = '2' AN
我正在尝试通过命令行读取文件名, 这是教授要我们输入的命令: java MultiBinaryClient xxxxxx.edu 6001 < files.txt 我正在尝试使用 args[3]获取文
在 C# 中,您可能会看到以下内容: [] 或类似的行(但没有大于/小于符号): [assembly: AssemblyTitle("MyProject")] 我知道第一个称为属性(它有 gt 和 l
我只是想知道大于/小于的结果是如何计算并返回给高级语言的。 我在这里寻找硬件门模型。 让我们用一个统一的例子来解释,比如说5 > 3。 最佳答案 它通常通过带有进位检测的减法来实现。 从门控的角度来看
这个问题在这里已经有了答案: strange output in comparison of float with float literal (8 个答案) 关闭 8 年前。 案例一 float
你到底如何检查一个数字属性是否小于 Apache Ant? 从我所看到的(我是 Ant 的新手)你只能做 ? 最佳答案 您可以使用 (见 http://ant.apa
在 C 中使用 float.h 我想知道如何找到最大的数字,如果我加到 1,答案将保持为 1。 即 1 + x = 1 如何找到 x? 最佳答案 如果你想要“小于 FLT_EPSILON 的最大数字”
我正在尝试查询节点统计信息端点(_nodes / stats)并收到此错误: {"error":{"root_cause":[{"type":"illegal_argument_exception",
有没有更快的方法来检查列表中的项目是否大于、小于或等于某个数字? 或者你只需要循环它?我只是好奇是否有为此预先构建的函数。 示例: 列表包含 5、5、10、15、15、20。 我想检查是否有多少个
因此,我必须编写一个代码,从用户那里获取 2 个日期(月/日/年),如果第一个日期小于第二个日期,则返回“true”。在任何其他情况下,日期将为“假”或“它们是相同的”。我被告知我不能要求用户执行指定
我有两个变量,如果它们的值彼此相差在 5 个数字以内,我想触发一些代码。不知道哪个变量具有更高的值,我可以这样做: if (var1 > var2) { if ((var1 - var2) < 5
我有一个函数,它接受一个对象并将其转换为字节数组: public static byte[] serialize(Object obj) throws IOException { try(By
下载大小已经低于 4MB 的应用程序是否也可以作为免安装应用程序未经修改地分发? 最佳答案 要将该应用程序作为免安装应用程序提供,仍需采取一些步骤。参见 http://g.co/instantapps
我有以下 SELECT 但无法正常工作: SELECT COUNT(userid) FROM login WHERE 17 YEAR(DATE_SUB(NOW(), INTERVAL TO_DAYS
我制作了一个脚本,其中 #hsz-wrap2 附加到最后一个可见的 div,当 div 数量低于或等于 16 在 #snapshot_vertical div 内。 但是,if 条件的工作方式我不明白
我在外部的一排内放置了一个 Logo 、一个搜索框和一个语言栏,并位于 Bootstrap 导航栏上方。这一行当然仍在主容器中,但它包含我提到的 3 个元素——我和我的客户认为这 3 个元素独立于导航
我是一名优秀的程序员,十分优秀!