最近我升级recyclerview-v7:23到了recyclerview-v7:24.2.0.我的应用程序有一个无尽的滚动列表.notifyItemInserted当我将加载视图添加到RecyclerView(null对象表示加载,id 0为空,-1表示页面结束)时,错误消息指向该行,并且它之前工作正常(recyclerview-v7:23)但突然我得到错误像这样,不知怎的,我的加载出现两次,然后当它删除一个,有一个加载仍然可见在顶部.
W/RecyclerView: Cannot call this method in a scroll callback. Scroll callbacks might be run during a measure & layout pass where you cannot change the RecyclerView data. Any method call that might change the structure of the RecyclerView or the adapter contents should be postponed to the next frame.java.lang.IllegalStateException:
at android.support.v7.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView.java:2403)
at android.support.v7.widget.RecyclerView$RecyclerViewDataObserver.onItemRangeInserted(RecyclerView.java:4631)
at android.support.v7.widget.RecyclerView$AdapterDataObservable.notifyItemRangeInserted(RecyclerView.java:10469)
at android.support.v7.widget.RecyclerView$Adapter.notifyItemInserted(RecyclerView.java:6211)
at com.sketchproject.infogue.fragments.MessageFragment.loadMessages(MessageFragment.java:109)
at com.sketchproject.infogue.fragments.MessageFragment.access$100(MessageFragment.java:42)
at com.sketchproject.infogue.fragments.MessageFragment$1.onLoadMore(MessageFragment.java:87)
at com.sketchproject.infogue.modules.EndlessRecyclerViewScrollListener.onScrolled(EndlessRecyclerViewScrollListener.java:74)
Run Code Online (Sandbox Code Playgroud)
当我删除部分错误(添加加载)它再次正常工作,我不知道为什么,更新版本的recyclerview阻止将数据添加到适配器太快或有回调函数,当"测量和布局"时触发recyclerview完了,这是我的代码
private void loadArticles(final int …Run Code Online (Sandbox Code Playgroud) 我有这个问题 - 只是为了测试目的,我添加ParseFile到ParseObject收到列表中的一个.它不是仅显示在该行中,而是显示每4-5行,有时更多,有时更少.我认为回收视图与此有关.奇怪的是,其他数据(从这个例子中删除)适用于position变量.
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
if(parseList.get(position).get("logo") != null){
ParseFile image = (ParseFile) parseList.get(position).get("logo");
String url = image.getUrl();
Glide.with(context)
.load(url)
.placeholder(R.drawable.piwo_48)
.transform(new CircleTransform(context))
.into(holder.imageView);
}
}
Run Code Online (Sandbox Code Playgroud) android parse-platform recycler-adapter android-recyclerview android-glide
所以我的代码只使用RecyclerView创建了一个CardView列表.运行我的代码后,我一直收到一个奇怪的错误,声称我的xml中有错误.摆弄了一会儿后,我发现,在我的布局文件,如果我改变<RecyclerView>对<android.support.v7.widget.RecyclerView>一切都工作得很好.为什么会这样?
我的活动.
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Menu;
import android.view.MenuItem;
import java.util.ArrayList;
public class CardListActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_card_list);
RecyclerView recyclerView = (RecyclerView)findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(linearLayoutManager);
ArrayList<String> list = new ArrayList<>();
for(int i = 0; i < 20; i++) {list.add("Item " + i);}
CardListAdapter cardListAdapter = new CardListAdapter(list);
recyclerView.setAdapter(cardListAdapter);
}
}
Run Code Online (Sandbox Code Playgroud)
我的适配器
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; …Run Code Online (Sandbox Code Playgroud) android material-design android-5.0-lollipop recycler-adapter android-recyclerview
我正在尝试使用recyclerview和浮动操作按钮来创建应用程序.我遇到的问题是浮动操作按钮阻碍了recyclerview中的按钮.我查看了Android应用程序如手机应用程序(你在gridvew中显示的联系人)是如何设计来处理这个问题的,我看到底部留有空白空间,在recyclelerview和浮动操作按钮之间留出空间,用户只需滚动到底部以避免重叠.我尝试在recyclelerview之后添加一个视图,但不会显示它,此视图也应该与recyclerview行一起移动.在Recyclerview的最后,我缺少什么来显示视图.我的布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#6fbababa">
<android.support.v7.widget.RecyclerView
android:id="@+id/my_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical"/>
<ImageButton
android:id="@+id/button_floating_action"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:src="@drawable/ic_fab"
android:background="@null"
android:layout_alignParentBottom="true"
android:layout_marginBottom="12dp"
android:layout_marginEnd="12dp"
android:layout_marginRight="12dp"
android:elevation="2dp"/>
<View
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_below="@id/my_recycler_view"
android:background="@color/white"/>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

更新:修改布局代码以使其工作.
<android.support.v7.widget.RecyclerView
android:id="@+id/my_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:paddingBottom="30dp"
android:scrollbars="vertical"/>
Run Code Online (Sandbox Code Playgroud) android android-layout recycler-adapter android-recyclerview
有许多示例如何在LiveData更改时将新列表推送到适配器.
我正在尝试在巨大的列表中更新一行(例如,帖子的评论数量).重置整个列表只更改一个字段是愚蠢的.
我能够添加观察者onBindViewHolder,但我无法理解何时应该删除观察者
@Override
public void onBindViewHolder(ViewHolder vh, int position) {
Post post = getPost(position);
vh.itemView.setTag(post);
post.getLiveName().observeForever(vh.nameObserver);
...
}
Run Code Online (Sandbox Code Playgroud) 我有一个具有多个视图类型的视图.
onBindViewHolder仅在getItemViewType更改值时调用滚动.这会导致我的列表项无法正确更新.
这是一个错误吗?或者我在这里做错了什么.这似乎是新recyclerView课程中非常奇怪的行为.
这是我的适配器:
package se.davison.smartrecycleradapter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.util.SparseIntArray;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
/**
* Created by richard on 10/11/14.
*/
public class SectionAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final String TAG = SectionAdapter.class.getSimpleName();
private final LayoutInflater inflater;
private final int sectionLayoutId;
private SparseIntArray positionSection;
private LinkedHashMap<AdapterItem, List<AdapterItem>> items = new LinkedHashMap<AdapterItem, List<AdapterItem>>();
private List<Class<? extends AdapterItem>> itemTypes = new ArrayList<Class<? extends …Run Code Online (Sandbox Code Playgroud) android android-adapter android-support-library recycler-adapter android-recyclerview
我使用RecyclerView显示具有列表布局的项目列表.我从列表布局切换到网格布局,在网格布局中仅显示所有数据的子集.此开关使用与列表布局呈现时不同的布局XML.
所有这一切都很好,除了当我滚动,回收(缓存?)列表布局视图填充网格,与适当的网格布局视图项混合.换句话说,我不是layout_grid.xml在RecyclerView 中使用my 为每个项目的layout_list.xml布局,而是使用布局获取项目,但是采用网格格式.
这告诉我LayoutManager工作正常,从列表切换到网格布局.但并非所有项目视图项都使用网格xml布局重新创建,而是使用回收列表布局视图.
我试过RecyclerView.removeAllViews(),RecyclerView.removeAllViewInLayout(),RecyclerView.swapAdapter()(强制适配器重装),都无济于事.
更新:
如果我在列表中向下滚动两个位置,然后从列表切换到网格,前两个位置不会通过onCreateViewHolder(),而是直接到onBindViewHolder(),因此不会强制使用网格布局xml.相反,前两个位置项目被回收(我认为)并以列表布局格式显示.
我RecyclerView用作列表来显示可以下载的歌曲.每个项目都有ProgressBar它View.当下载开始时,我使用a Handler来通知每个项目更新ProgressBar以显示歌曲下载进度.
Q1.这是一种正确的方法吗?还是有其他方法可以更恰当地做到这一点.
Q2.当我们
adapter.notifyItemChanged(position);用来更新单个项目的内容时,RecyclerView会崩溃.它是从Handler使用中调用的Runnable.但是,日志不会显示我的代码的任何痕迹.为什么?
以下是此问题的日志:
05-06 19:09:45.804: E/AndroidRuntime(32115): FATAL EXCEPTION: main
05-06 19:09:45.804: E/AndroidRuntime(32115): java.lang.IllegalArgumentException: Tmp detached view should be removed from RecyclerView before it can be recycled: ViewHolder{41b7bec0 position=6 id=-1, oldPos=-1, pLpos:-1 update changed tmpDetachedundefined adapter position no parent}
05-06 19:09:45.804: E/AndroidRuntime(32115): at android.support.v7.widget.RecyclerView$Recycler.recycleViewHolderInternal(RecyclerView.java:3861)
05-06 19:09:45.804: E/AndroidRuntime(32115): at android.support.v7.widget.RecyclerView.removeAnimatingView(RecyclerView.java:779)
05-06 19:09:45.804: E/AndroidRuntime(32115): at android.support.v7.widget.RecyclerView.access$5300(RecyclerView.java:127)
05-06 19:09:45.804: E/AndroidRuntime(32115): at android.support.v7.widget.RecyclerView$ItemAnimatorRestoreListener.onAddFinished(RecyclerView.java:8228)
05-06 19:09:45.804: E/AndroidRuntime(32115): at android.support.v7.widget.RecyclerView$ItemAnimator.dispatchAddFinished(RecyclerView.java:8573) …Run Code Online (Sandbox Code Playgroud) 我创建了一个非常简单的项目,StaggeredGridLayoutManager通过recyclerview 显示28个图像.但是当我滚动Recyclerview时,它会移动项目,例如从左向右移动或交换左右列.
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
public class MainActivity extends Activity {
String mImageDir;
private RecyclerView mRecyclerView;
private StaggeredGridLayoutManager mLayoutManager;
MyRecyclerAdapter myRecyclerAdapter;
List<ImageModel> mImageList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = (RecyclerView)findViewById(R.id.recyclerview_rootview);
mLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
mLayoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS);
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setHasFixedSize(false);
mImageList = new ArrayList<ImageModel>();
for (int i = 1; i < 29 ; i++) {
ImageModel img = new ImageModel();
img.setTitle("Image No " + i);
int drawableResourceId …Run Code Online (Sandbox Code Playgroud) android recycler-adapter staggeredgridlayout android-recyclerview
对于了解其机制或愿意深入了解源代码的人来说,这是一个关于RecyclerView内部行为的问题.我希望通过对源代码的引用来支持答案.
(向下滚动到'换句话说'以获得更集中的问题)
我需要了解notify*行为(例如notifyItemInserted())是如何排队的.想象一下,我有一个由此列表备份的适配器:
ArrayList<String> list = Arrays.asList("one", "three", "four");
Run Code Online (Sandbox Code Playgroud)
我想补充的价值观zero和two,即失踪.
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);
Run Code Online (Sandbox Code Playgroud)
这非常简单明了,无话可说.
但是,如果两个动作彼此非常接近,并且两者之间没有布局传递怎么办?
list.add(1, "two");
list.add(0, "zero”);
Run Code Online (Sandbox Code Playgroud)
我现在应该怎么做?
adapter.notifyItemInserted(1);
adapter.notifyItemInserted(0);
Run Code Online (Sandbox Code Playgroud)
或者可能
adapter.notifyItemInserted(2);
adapter.notifyItemInserted(0);
Run Code Online (Sandbox Code Playgroud)
?从适配器的角度来看,列表立即切换one, three, four到zero, one, two, three, four第二个选项似乎更合理.
list.add(0, “zero”);
adapter.notifyItemInserted(0);
list.add(2, “two”);
adapter.notifyItemInserted(...)
Run Code Online (Sandbox Code Playgroud)
现在怎么样?1还是2?该列表之后立即更新,但我确信它们之间没有布局传递.
你遇到了主要问题,我想知道在这些情况下我应该怎么做.真实情况是我有多个异步任务以一个 …