- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
这个问题已经被问过很多次了,但似乎没有符合我要求的解决方案。
我有一个有说明的食谱。每条指令都在 RecyclerView
中排序。顺序必须从上到下。它不能像这个问题的许多答案一样被逆转。
我有一个添加按钮,单击该按钮时,一个新项目会添加到列表底部。插入后我需要滚动到新项目。所以我在按钮的 onClick
事件中使用了以下代码:
mRecyclerAdapter.addItem(newInstruction);
mRecyclerView.smoothScrollToPosition(mRecyclerAdapter.getItemCount() - 1);
这会滚动到倒数第二个项目,因为在适配器的 addItem() 方法中我有这个:
mItems.add(item);
notifyItemInserted(getItemCount() - 1);
我不知道 notifyItemInserted()
调用的细节,但它似乎在一个单独的线程上,这意味着 smoothScrollToPosition()
之前被调用 View 是在插入后列出的。因此,它只会滚动到倒数第二个项目。
我曾尝试按照 onItemInserted
的思路寻找“回调”函数,但我没有找到任何运气。例如,无人接听 Here .
我该如何解决这个问题?
编辑开始
我在一个新的项目中简化了代码,希望能找到问题所在,找出问题所在。启用滚动标志时,这似乎是由 CoordinatorLayout/AppBarLayout 引起的问题。滚动似乎没有考虑 AppBarLayout 添加的额外滚动空间。
在下面的示例代码中,如果您禁用应用栏的滚动标志,则滚动到屏幕底部会按预期完美运行。但是,如果启用 AppBarLayout 滚动行为并更改其高度,您会注意到滚动到底部会偏离给定高度。
我需要滚动行为,那么如何让它们相互配合得很好呢?请注意,我已经更改了问题以反射(reflect)问题。
MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
public static final int ITEMS_COUNT = 50;
private FloatingActionButton mFloatingActionButton;
private RecyclerView mRecyclerView;
private RecyclerAdapter mRecyclerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mFloatingActionButton = (FloatingActionButton) findViewById(R.id.fabButton);
mFloatingActionButton.setOnClickListener(this);
setupRecyclerView();
}
private void setupRecyclerView() {
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerAdapter = new RecyclerAdapter(createItemList());
mRecyclerView.setAdapter(mRecyclerAdapter);
}
private List<String> createItemList() {
List<String> itemList = new ArrayList<>();
for (int i = 0; i < ITEMS_COUNT; i++) {
itemList.add("Item " + i);
}
return itemList;
}
@Override
public void onClick(View v) {
mRecyclerView.scrollToPosition(49);
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/coordinatorLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:id="@+id/appBarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- changing the height affects the scrolling distance -->
<TextView
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="Header"
app:layout_scrollFlags="scroll|enterAlways"/> <!-- this is the problem -->
</android.support.design.widget.AppBarLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fabButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="20dp"/>
</android.support.design.widget.CoordinatorLayout>
RecyclerAdapter.java
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<String> mItemList;
public RecyclerAdapter(List<String> itemList) {
mItemList = itemList;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Context context = parent.getContext();
View view = LayoutInflater.from(context).inflate(R.layout.recycler_item, parent, false);
return RecyclerItemViewHolder.newInstance(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
RecyclerItemViewHolder holder = (RecyclerItemViewHolder) viewHolder;
String itemText = mItemList.get(position);
holder.setItemText(itemText);
}
@Override
public int getItemCount() {
return mItemList == null ? 0 : mItemList.size();
}
}
recycler_item.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="8dp"
card_view:cardCornerRadius="4dp">
<TextView
android:id="@+id/itemTextView"
android:layout_width="match_parent"
android:layout_height="?attr/listPreferredItemHeight"
android:gravity="center_vertical"
android:padding="8dp"
style="@style/Base.TextAppearance.AppCompat.Body2"/>
</android.support.v7.widget.CardView>
编辑结束
最佳答案
我做了更多研究,发现了这个 question/answer它有解决此问题的方法。虽然不理想,但现在必须这样做。虽然真正的解决方案不应该折叠 AppBarLayout,但滚动应该考虑所需的额外滚动空间。也许这只是一个被忽视的错误。
关于android - CoordinatorLayout/AppBarLayout 干扰 RecyclerView scrollToPosition(底部滚动),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40713031/
根据我目前的阅读,Behavior 只能应用于 CoordinatorLayout 的直接子级。但是下面的代码让我感到困惑:
CoordinatorLayout 在另一个 CoordinatorLayout 中,这样滚动 subview 也应该滚动父 CoordinatorLayout。 我有一个 coordinatorLa
我正在创建一个 Android 应用程序,我想隐藏 BottomAppBar (它有一个固定在中心的工厂)每当我滚动 RecyclerView谁在我的 Activity fragment 内而不更改
我提到了 This Question但没有答案对我有用。所以基本上我有一个 BottomNavigationView,它在向下滚动时隐藏并在向上滚动时显示。当我通过触摸滚动 Recycler View
我想向 CoordinatorLayout 添加一个页脚,其中包含一个 TabView + ViewPager。 这是 main.xml:
我有一个 CoordinatorLayout 并且我想要一个 FrameLayout 位于所有其他 Layouts 和 widgets 之下。我试过使用 android:layout_below/ab
我想用 RecyclerView 和 Toolbar 创建简单的 CoordinatorLayout,但与标准解决方案的区别在于 Toolbar 应该在底部,并且当 RecyclerView 滚动到底
我可以在我的 xml 文件中使用协调器布局,但是当我尝试将它导入我的 java 类时,它说“无法解析符号 CoordinatorLayout,而同一包中的其他类工作正常。 截图如下: 依赖项: 最佳答
我正在使用单个 Activity - 多个 fragment 结构。在 Activity 中,我使用 v7 工具栏作为操作栏。我有一些带有 viewpager 的 fragment ,有些也带有标签。
这让我抓狂。这两天我一直在努力完成这项工作,但没有取得任何进展。我想要一个应用程序栏,它在我向下滚动 ViewPager 时隐藏,并在我向上滚动 ViewPager 时显示,这似乎是标准的做法。
我需要创建一个具有线性布局的 Coordinatorlayout 和一个具有相同空间的 RecyclerView。 我试过将 layout_weight 设置为 0.5,但 RecyclerView
我尝试通过 CoordinatorLayout 获得此结果,但无法在背景上设置全屏图像,该图像在整个屏幕上展开,与图像中相同。我尝试了几种方法,例如将 LinearLayout 放入 Collapsi
我有一个包含 3 个使用回收 View 的 fragment 的 viewpager。当用户滚动回收 View 时,我试图隐藏工具栏。我的问题是工具栏在用户滚动时隐藏/显示但没有完全隐藏。我不明白我做
我有一个抽屉的主要 Activity ,抽屉有一个容器布局,我用 FragmentManager 替换每个 fragment 。 我想在滚动上隐藏/显示的我的一个子 fragment 中添加一个 FA
这里我有一个相当复杂的动画,可以使用 CoordinatorLayout 以简单的方式解决(我相信) .它有 3 个状态: 初始(左侧屏幕)- 标题 View 完全显示(橙色 背景):工具栏,灰色 r
我有一个全屏显示的 Activity。这适用于我尝试过的许多布局,但当 CoordinatorLayout 是根 ViewGroup 时除外。 CoordinatorLayout 本身的宽度和高度都设
看看下面的布局。您会看到, float 按钮距离底部太远。这是因为显示了 Toolbar 和 Tabs,并且 ViewPager 的高度不正确。所以不知何故我在 layout_height 上做错了什
我是 android Material 设计方面的新手。所以,请多多包涵。我尝试为我的家庭 Activity 实现 FAB,然后实现 snackbar 。自然,它高于我的 FAB。我研究了 Coord
我正在尝试从新发布的 Android Design Support Library 中实现 CoordinatorLayout并且我根据示例 here 在我的 XML 布局中使用了以下代码:
我正在尝试使用 RecyclerView 和 TextView 实现 CoordinatorLayout,其中 TextView 将根据您滚动 RecyclerView 的方式进行动画处理。但是我的自
我是一名优秀的程序员,十分优秀!