在我的项目中,我需要禁用RecyclerViewwhile 的"更改"动画notifyItemChanged.
我在源头调查RecyclerView并被覆盖android.support.v7.widget.DefaultItemAnimator如下:
private static class ItemAnimator extends DefaultItemAnimator
{
@Override
public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, int fromX, int fromY, int toX, int toY) {
if(oldHolder != null)
{
oldHolder.itemView.setVisibility(View.INVISIBLE);
dispatchChangeFinished(oldHolder, true);
}
if(newHolder != null)
{
dispatchChangeFinished(newHolder, false);
}
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
但我不确定我是否符合Google文档的规范:
RecyclerView.ItemAnimator.animateChange
根据我的理解源代码,如果我没有正确覆盖方法,oldHolder 将不会被回收.
请帮我弄清楚如何以animateChange正确的方式覆盖.
这是我正在尝试使用以下所有元素构建的应用程序:
但是,一切正常,我希望内部水平回收视图不捕获任何垂直滚动.所有垂直滚动必须朝向外部垂直回收视图,而不是水平回滚视图,因此垂直滚动将允许工具栏根据其scrollFlag退出视图.
当我将手指放在recyclerview的"StrawBerry Plant"部分并向上滚动时,它会滚出工具栏:
如果我将手指放在水平滚动视图上并向上滚动,它根本不会滚出工具栏.
以下是我目前为止的xml布局代码.
该活动的XML布局:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
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"
android:id="@+id/fragment_container"
android:clipChildren="false">
<android.support.design.widget.CoordinatorLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/container"
>
<android.support.design.widget.AppBarLayout
android:id="@+id/appBarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:minHeight="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_scrollFlags="scroll|enterAlways">
</android.support.v7.widget.Toolbar>
<android.support.design.widget.TabLayout
android:id="@+id/sliding_tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
style="@style/CustomTabLayout"
/>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
/>
</android.support.design.widget.CoordinatorLayout>
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)
的"水果"片段 XML布局(其是用于该片段编码-片段被标记在上面图片):
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/progressBar"
android:visibility="gone"
android:layout_centerInParent="true"
android:indeterminate="true"/>
<!-- <android.support.v7.widget.RecyclerView-->
<com.example.simon.customshapes.VerticallyScrollRecyclerView
android:id="@+id/main_recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
我使用了一个名为VerticallyScrollRecyclerView的自定义类,该类跟随google在视图组中处理触摸事件的示例.它的目的是拦截和使用所有垂直滚动事件,以便它可以滚动/滚出工具栏: …
android android-layout android-recyclerview android-coordinatorlayout android-appbarlayout
我正在使用新RecyclerView-Layout的a SwipeRefreshLayout并经历了一种奇怪的行为.当滚动列表回到顶部时,有时顶部的视图会被切入.

如果我现在尝试滚动到顶部 - Pull-To-Refresh触发器.

如果我尝试删除Recycler-View周围的Swipe-Refresh-Layout,问题就消失了.它可以在任何手机上重现(不仅仅是L-Preview设备).
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/contentView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone">
<android.support.v7.widget.RecyclerView
android:id="@+id/hot_fragment_recycler"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.v4.widget.SwipeRefreshLayout>
Run Code Online (Sandbox Code Playgroud)
这是我的布局 - 行由RecyclerViewAdapter动态构建(此列表中有2个Viewtypes).
public class HotRecyclerAdapter extends TikDaggerRecyclerAdapter<GameRow> {
private static final int VIEWTYPE_GAME_TITLE = 0;
private static final int VIEWTYPE_GAME_TEAM = 1;
@Inject
Picasso picasso;
public HotRecyclerAdapter(Injector injector) {
super(injector);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position, int viewType) {
switch (viewType) {
case VIEWTYPE_GAME_TITLE: {
TitleGameRowViewHolder holder = (TitleGameRowViewHolder) viewHolder;
holder.bindGameRow(picasso, getItem(position));
break;
}
case VIEWTYPE_GAME_TEAM: …Run Code Online (Sandbox Code Playgroud) 我有一个RecyclerView在里面CardView.该CardView有500dp的高度,但我想缩短这个高度,如果RecyclerView是较小的.所以我想知道RecyclerView在第一次完成放置项目时是否有任何监听器被调用,从而可以将RecyclerView高度设置为CardView高度(如果小于500dp).
我正在使用RecyclerView显示项目的名称.我的行包含单行TextView.项目名称存储在List<String> mItemList.
要更改内容RecyclerView,我替换字符串mItemList并调用notifyDataSetChanged()RecyclerViewAdapter.
但是如果我尝试更改mItemListRecyclerView滚动时的内容,有时它会给我
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 157(offset:157).state:588
如果尺寸mItemList小于之前,就会发生这种情况.那么改变内容的正确方法是RecyclerView什么?这是一个错误RecyclerView吗?
这是Exception的完整堆栈跟踪:
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 157(offset:157).state:588
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3300)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3258)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1803)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1302)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1265)
at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1093)
at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:956)
at android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:2715)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
at android.view.Choreographer.doCallbacks(Choreographer.java:555)
at android.view.Choreographer.doFrame(Choreographer.java:524)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4921)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at …Run Code Online (Sandbox Code Playgroud) 我的RecyclerView不调用onCreateViewHolder,onBindViewHolder,因此,在recyclerview中不会出现任何内容.我把日志用于调试,没有显示日志.什么可以?
我的适配器:
public class CommentListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
private static final int EMPTY_VIEW = 10 ;
private ArrayList<comment> mItems;
Boolean firstTime = true;
private Typeface mTf = null;
Context mContext;
public CommentListAdapter(Context context,ArrayList<comment> items){
Log.e("Adapter", "constructor Called");
this.mItems = items;
mContext = context;
}
public class EmptyViewHolder extends RecyclerView.ViewHolder {
public EmptyViewHolder(View itemView) {
super(itemView);
}
}
public class ViewHolder extends RecyclerView.ViewHolder{
TextView mAuthorName;
TextView mMessage;
NetworkImageView mThumbnail;
public ViewHolder(View itemView) {
super(itemView);
mAuthorName = (TextView)itemView.findViewById(R.id.author_name);
mMessage = (TextView)itemView.findViewById(R.id.message);
mThumbnail = …Run Code Online (Sandbox Code Playgroud) 没有得到任何错误,所有数据似乎都有效.出于某种原因,正在调用与视图相关的方法.我确定了以下内容:
getItemCount()是唯一被调用的适配器方法,并返回一个正整数值,(我知道这将是你们要看的区域)
正在调用构造函数,成员变量是有效的.
父视图是一个垂直的LinearLayout; 没有滚动视图,或任何其他具有自己的滚动属性的视图.
包含片段视图已创建并显示在屏幕上.
这是片段中的声明,后跟适配器.任何帮助将不胜感激,因为这是完全困惑的.
SubMenuAdapter adapter = new SubMenuAdapter(getActivity(), mContentItems);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)
public class SubMenuAdapter extends RecyclerView.Adapter<SubMenuAdapter.ViewHolder> {
private static final String TAG = String.format("==> %S", SubMenuAdapter.class.getSimpleName());
private final List<ContentItem> mContentItems;
private Context mContext;
public SubMenuAdapter(Context context, List<ContentItem> contenItems) {
Log.d(TAG, "Constructor called");
mContentItems = contenItems;
mContext = context;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Log.d(TAG, "onCreateViewHolder called");
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_resource_efficiency, parent, false);
return new ViewHolder(view);
}
@Override
public void …Run Code Online (Sandbox Code Playgroud) 我有一个RecyclerView.每行都有一个播放按钮,textview和Progressbar.单击播放按钮时必须播放我的SD卡中的音频并且必须进度Progressbar问题是当我向下滚动recyclerview时,请更改下一行中的Progressbar.意思是我可以同时在屏幕上显示5个项目.当我滚动到第6行,第6行搜索栏突然改变.
public class ListAdapter extends RecyclerView.Adapter {
private List<Historyitem> stethitems;
public Context mContext;
public Activity activity;
public Handler mHandler;
static MediaPlayer mPlayer;
static Timer mTimer;
public ListAdapter(Activity activity,Context mContext,List<Historyitem> stethitems) {
this.stethitems = stethitems;
this.mContext = mContext;
this.activity = activity;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
View rootView = LayoutInflater.
from(mContext).inflate(R.layout.stethoscopeadapteritem, null, false);
RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
rootView.setLayoutParams(lp);
mHandler = new Handler();
return new MyViewHolder(rootView);
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, int position) { …Run Code Online (Sandbox Code Playgroud) 我在其中有一个片段RecyclerView与LinearLayoutManager其中有CardView项目.点击时有一个浮动操作按钮,项目应滚动到顶部.我已经尝试使用scrollToPosition以及scrollToPositionWithOffset与RecyclerView和也LinearLayoutManager,如下图所示.但它根本没有效果.为什么会这样?任何人都可以帮助我.
我已将其RecyclerView直接放在SwipeRefreshViewxml文件中.我setFloatingActionButton一旦设置适配器就打电话给我RecyclerView.
public void setFloatingActionButton(final View view) {
float = (android.support.design.widget.FloatingActionButton) getActivity().findViewById(R.id.float);
float.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mRecyclerView.smoothScrollToPosition(0);
android.support.design.widget.Snackbar.make(view, "Scrolled to Top", android.support.design.widget.Snackbar.LENGTH_SHORT)
.setAction("Ok", new View.OnClickListener() {
@Override
public void onClick(View v) {
LinearLayoutManager llm = (LinearLayoutManager) mRecyclerView.getLayoutManager();
llm.scrollToPosition(0);
}
})
.setActionTextColor(getActivity().getResources().getColor(R.color.coloLink))
.show();
}
});
}
Run Code Online (Sandbox Code Playgroud) 我正在使用一个RecyclerView并从API获取对象,批量为十.对于分页,我使用EndlessRecyclerOnScrollListener.
一切正常.现在剩下的就是在列表底部添加一个进度微调器,同时由API提取下一批对象.以下是Google Play商店应用的屏幕截图,其中显示了以下ProgressBar内容RecyclerView:
问题是,在获取下一批对象时,既RecyclerView没有EndlessRecyclerOnScrollListener内置支持也没有显示ProgressBar底部的内置支持.
我已经看到了以下答案:
1. 将不确定的ProgressBar页脚放在RecyclerView网格中.
2. 添加项目到无尽的滚动RecyclerView与ProgressBar在底部.
我不满意这些答案(由同一个人).这涉及null 在用户滚动时中途将对象拴入数据集中,然后在下一批次交付后将其取出.它看起来像是一个黑客,可以回避主要问题,可能会或可能不会正常工作.它会在列表中引起一些刺耳和失真
使用SwipeRefreshLayout不是解决方案.SwipeRefreshLayout涉及从顶部拉取以获取最新的项目,并且它无论如何都不显示进度视图.
有人可以为此提供一个很好的解决方案吗?我有兴趣知道Google是如何为自己的应用程序实现此功能的(Gmail应用程序也有此功能).是否有任何文章详细显示?所有的答案和评论将不胜感激.谢谢.
其他一些参考:
1. 分页RecyclerView.(精湛的概述......)
2. RecyclerView页眉和页脚.(更多相同......)
android android-listview android-progressbar android-5.0-lollipop android-recyclerview