Articles of android recyclerview

如何在回收器视图中删除animation时隐藏分隔符

RecyclerView默认情况下会带有一个很好的删除animation,只要你setHasStableIds(true)并在getItemId上提供正确的实现。 最近,我通过https://stackoverflow.com/a/27037230/72437将分隔符添加到RecyclerView 结果如下 https://youtu.be/c81OsFAL3zY (为了在删除animation播放时使分隔符更加明显,我暂时将RecyclerView背景更改为红色) 当播放删除animation时,分隔符仍然可见。 但是,如果我查看GMail示例,当播放删除animation时,分隔线不再可见。 它们被覆盖在纯色区域。 我可以知道,当删除animation播放时,如何通过不显示分隔线来实现与GMail相同的效果?

RecyclerView问答

我正在创建一个Q&A,其中每个问题都是一张卡片。 答案开始显示第一行,但当点击它时,它应该展开以显示完整的答案。 当答案扩展/折叠时,RecyclerView的其余部分应设置animation以为扩展或折叠腾出空间,以避免显示空白区域。 我观看了有关RecyclerViewanimation的演讲,并且相信我想要一个自定义的ItemAnimator,我在其中覆盖animateChange。 那时我应该创建一个ObjectAnimator来animationView的LayoutParams的高度。 不幸的是,我很难将它们捆绑在一起。 当重写canReuseUpdatedViewHolder时我也返回true,因此我们重用相同的viewholder。 @Override public boolean canReuseUpdatedViewHolder(RecyclerView.ViewHolder viewHolder) { return true; } @Override public boolean animateChange(@NonNull RecyclerView.ViewHolder oldHolder, @NonNull final RecyclerView.ViewHolder newHolder, @NonNull ItemHolderInfo preInfo, @NonNull ItemHolderInfo postInfo) { Log.d(“test”, “Run custom animation.”); final ColorsAdapter.ColorViewHolder holder = (ColorsAdapter.ColorViewHolder) newHolder; FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) holder.tvColor.getLayoutParams(); ObjectAnimator halfSize = ObjectAnimator.ofInt(holder.tvColor.getLayoutParams(), “height”, params.height, 0); […]

RecyclerView和适配器数据更新

对于了解其机制或愿意深入了解源代码的人来说,这是一个关于RecyclerView内部行为的问题。 我想通过引用源代码来支持答案。 原始问题 (向下滚动到’换句话说’以获得更集中的问题) 我需要了解notify* actions(例如, notifyItemInserted() )是如何入队的。 想象一下,我有一个由此列表备份的适配器: ArrayList list = Arrays.asList(“one”, “three”, “four”); 我想添加zero和two值,缺少值。 例1 list.add(1, “two”); // notify the view adapter.notifyItemInserted(1); // Seconds later, I go on with zero list.add(0, “zero”); // notify the view adapter.notifyItemInserted(0); 这非常简单明了,没什么好说的。 例2 但是,如果这两个动作彼此非常接近,并且两者之间没有布局传递怎么办? list.add(1, “two”); list.add(0, “zero”); 我现在应该怎么做? adapter.notifyItemInserted(1); adapter.notifyItemInserted(0); 或者可能 adapter.notifyItemInserted(2); adapter.notifyItemInserted(0); ? 从适配器的角度来看,列表立即从one, three, […]

如何使用LinearLayoutManager实现可扩展项目(随Android L一起推出)

RecyclerView已经与Android L一起推出,是AppCompat v7库的一部分。 然后我决定使用这个全新的RecyclerView更新我的应用程序以替换我的ListView 。 为此,在为RecyclerView设置LayoutManager ,我使用的是LinearLayoutManager ,它工作正常。 这是很难的事情:当我想将ExpandableListView更改为RecyclerView 。 由于谷歌还没有创建“ ExpandableLayoutManager ”,这非常棘手,我无法做到这一点。 文档提到了孩子,但它似乎是RecyclerView的根视图中的孩子而不是孩子自己。 有人有解决方法或一些线索吗? 或者至少有一些信息,比如从哪里开始,以便我可以实现自己的LayoutManager 。

RecyclerView正在切断最后一项

我有一个带有工具栏的片段和里面的recyclerView。 我使用虚拟数据填充recyclerView,然后尝试显示它们。 出于某种原因,recyclerView的最后一个元素正在被截止。 这是片段的XML: 列表中的项目非常简单: 我现在在列表的末尾,但最后一个元素仍然看起来是截止的。 我使用的是2015-09-23 google libraries的最新版本,23.0.1,(即com.android.support:recyclerview-v7:23.0.1),以及build.gradle中的以下配置: compileSdkVersion 23 buildToolsVersion “23.0.1” defaultConfig { minSdkVersion 14 targetSdkVersion 23 versionCode 1 versionName “1.0” multiDexEnabled true// Enabling multidex support } 任何帮助将不胜感激,因为我很难解决这个问题:( 解 好的,在将代码清理到基本要素并消除复杂性之后,我发现了问题:它是错误标志和缺失或额外属性的组合。 以下适用于Android 4.x和5.x: 简而言之,android:fitsSystemWindows =“true”应该只在coordinatorLayout,AppBarLayout和theCollapsingToolbarLayout(我们希望根据Android 5.x上的屏幕进行调整),app:layout_scrollFlags应该设置to“scroll | enterAlways | enterAlwaysCollapsed”,工具栏应该具有高度,actionBar的高度。 最后,最好保持RecyclerView尽可能干净,这样您就可以控制每个订单项的布局间距。

RecyclerView适配器采用错误的值

我有一个RecyclerView显示两种View一种代表User发布,另一种代表Event发布。 两者都有共同的元素,例如显示时间戳的TextView 。 所以我创建了一个PublicationViewHolder ,它将TextView时间戳记转换为variables并加载它。 我的问题是适配器最初加载正确的值,但是当我向下滚动并再次向上滚动时,位置中的值会被其他位置的值更改。 这是代码: public class PublicationViewHolder extends RecyclerView.ViewHolder { private TextView vTimeStamp; public PublicationViewHolder(View itemView) { super(itemView); this.vTimeStamp = (TextView) itemView.findViewById(R.id.txt_view_publication_timestamp); } public void load(Publication publication, int i) { load(publication); try { if (Publication.TYPE_USER_PUBLICATION == publication.getType()) { load((UserPublication) publication); } else if (Publication.TYPE_EVENT_PUBLICATION == publication.getType()) { load((EventPublication) publication); } } catch […]

使用setNestedScrollingEnabled(false)时如何避免阻止滚动?

背景 我们有一个非常复杂的布局,其中包含CollapsingToolbarLayout,以及底部的RecyclerView。 在某些情况下,我们通过在RecyclerView上调用setNestedScrollingEnabled(boolean)来暂时禁用CollapsingToolbarLayout的展开/折叠。 问题 这通常很好。 但是,在某些(有点罕见)情况下,RecyclerView上的慢速滚动会被半阻止,这意味着它会在向下滚动时尝试向后滚动。 这就好像它有2个滚动相互争斗(向上滚动并向下滚动): 触发此操作的代码如下: RES /布局/ activity_scrolling.xml ScrollingActivity.java public class ScrollingActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_scrolling); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); final RecyclerView nestedView = (RecyclerView) findViewById(R.id.nestedView); findViewById(R.id.disableNestedScrollingButton).setOnClickListener(new OnClickListener() { @Override public void onClick(final View v) { nestedView.setNestedScrollingEnabled(false); } }); findViewById(R.id.enableNestedScrollingButton).setOnClickListener(new OnClickListener() { @Override […]

Recyclerview + Content provider + CursorLoader

我在SQLite数据库中有一些数据。我有一个内容提供程序,它将从数据库中获取数据。 现在问题是如何实现cursorLoader与recyclerview一起工作? 此外,任何人都可以解释为什么我们需要将数据从游标传输到对象以显示在listview / recyclerview中而不是直接从游标中显示? 例如,在自定义cursorAdapter类中, Person person = new Person(cursor.getString(cursor.getColumnIndexOrThrow(PERSON_NAME))); textview.setText = person.getName(); 要么 textview.setText = cursor.getString(cursor.getColumnIndexOrThrow(PERSON_NAME)); 以上哪种方法比较好? 在过去,我们曾经有listview和gridview,现在看来它们被合并成为recyclerview。 那么,我如何实现基于网格的recyclerview?

RecyclerView项目没有变化

我在一个片段中有一个RecyclerView ,它在TabLayout中重复出现。 我在RecyclerView中遇到了视图不变的问题。 我在每个标签上都有一个微调器。 我想在选择微调器项时更改数据。 我的案子: 在标签之间切换时 – 项目已更改 在第一个选项卡中在微调器中选择另一个值时 – 项目未更改 。 (但是数据在适配器类中发生了变化。首先,它在选择期间不为null然后为null。但是第一个没有空的数据没有出现,它被替换为null。使用断点find它)。 注意:在这种情况下,切换选项卡时,项目将更改为上一个选项卡中的微调器选定项目。 然后它消失并在选项卡中显示当前项目。 在最后一个选项卡中在微调器中选择另一个值时 – 项目已更改 。 我的视图寻呼机适配器类 public class StudentViewPagerAdapter extends FragmentStatePagerAdapter { private final List mFragmentList = new ArrayList(); private final List mFragmentTitleList = new ArrayList(); public StudentViewPagerAdapter(FragmentManager fm) { super(fm); } public void addFragment(StudentList fragment,Clazz clazz){ mFragmentList.add(fragment); mFragmentTitleList.add(clazz); } […]

如何在RecyclerView上的排序(notifyDataSetChanged)期间提供自定义animation

目前,通过使用默认animationandroid.support.v7.widget.DefaultItemAnimator ,这是我在排序过程中遇到的结果 DefaultItemAnimatoranimationvideo: https : //youtu.be/EccI7RUcdbg public void sortAndNotifyDataSetChanged() { int i0 = 0; int i1 = models.size() – 1; while (i0 < i1) { DemoModel o0 = models.get(i0); DemoModel o1 = models.get(i1); models.set(i0, o1); models.set(i1, o0); i0++; i1–; //break; } // adapter is created via adapter = new RecyclerViewDemoAdapter(models, mRecyclerView, this); adapter.notifyDataSetChanged(); } 但是,我更喜欢提供自定义animation,而不是排序期间的默认animation(notifyDataSetChanged)。 […]