使用CursorLoader更新ListView是一种从数据库向UI显示数据的简单方法.模型修改传播到UI而没有额外的工作,可能不那么有效.
RecyclerView.adapter提供更多粒度的访问权限,允许例如指定删除特定项目的适配器.
但是,调用那些首选方法(notifyItem*),替换notifyDataSetChanged的最佳位置是什么?
显然,适配器不能观察contentProvider,否则它将不知道模型修改的性质(就像之前一样).
可以使用不同的模式,例如添加总线以发布来自提供者的修改,创建可以使用适配器的引用的单例模型,可以使用演示者(在L中引入),或者创建活动绑定服务.
这是一个常见的用例:同步进程在DB中插入一个条目(或者收到一个gcm通知,也在DB中插入一个条目),然后我希望通过调用notifyItemInserted来更新UI(如果已启动).在哪里拨打这个电话?
谢谢.
我正在使用最新的RecyclerView库来显示一个列表,其中包含一个选项,可以将项目添加到此列表中.该列表的顺序相反,因此最新的添加内容显示在底部.从顶部向回收者视图添加新项目时,会显示一个漂亮的动画,并自动滚动列表以显示最新项目.
但是,从底部添加新项目时,在动画新项目时,项目不会同样被推高.这会导致奇怪的行为,即添加新项目并且除非用户滚动到列表底部,否则无法看到动画.
作为临时修复,我强制循环器视图适配器在添加新项目后滚动到第一个位置.这不像从回收站视图顶部添加那样无缝,是否有适当的方法来实现它?
相应的代码如下:
la.addItem(0, msg);
layoutManager.scrollToPosition(0);
Run Code Online (Sandbox Code Playgroud) animation android adapter recycler-adapter android-recyclerview
我申请的利润率等于我对RecyclerView使用GridLayoutManager通过重写getItemOffsets()方法(见下面我的代码)。
但是,当从适配器中删除对象时,将在没有偏移的情况下调用删除动画。因此,酰胺化在与要去除的物体不同的位置开始。
我试图通过来获取位置,getSpanIndex(position)但是位置(parent.getChildAdapterPosition(view))返回,NO_POSITION因为调用时已将对象从适配器中移除getItemOffsets()。
有什么办法可以抵消我的情况吗?
@Override
public void getItemOffsets(Rect outRect, View view,
RecyclerView parent, RecyclerView.State state) {
GridLayoutManager mgr = parent.getLayoutManager();
int position = parent.getChildAdapterPosition(view);
if (position == RecyclerView.NO_POSITION) {
// here I need to access the position of the current element
// and call outRect.set(left, top , right, bottom);
// which is not possible because it is no longer in the adapter
return;
}
int spanCount …Run Code Online (Sandbox Code Playgroud) android android-animation recycler-adapter android-recyclerview
当我滚动我的recyclerview太快时,我得到了以下崩溃
java.lang.IllegalArgumentException: Scrapped or attached views may not be recycled. isScrap:false isAttached:true
at android.support.v7.widget.RecyclerView$Recycler.recycleViewHolderInternal(RecyclerView.java:5659)
at android.support.v7.widget.RecyclerView$Recycler.recycleView(RecyclerView.java:5603)
at android.support.v7.widget.GapWorker.prefetchPositionWithDeadline(GapWorker.java:277)
at android.support.v7.widget.GapWorker.flushTaskWithDeadline(GapWorker.java:324)
at android.support.v7.widget.GapWorker.flushTasksWithDeadline(GapWorker.java:337)
at android.support.v7.widget.GapWorker.prefetch(GapWorker.java:344)
at android.support.v7.widget.GapWorker.run(GapWorker.java:370)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Run Code Online (Sandbox Code Playgroud)
我已经尝试了我的所有努力,并在stackoverflow上得到类似的问题,但没有一个像下面的链接一样有用,
我不知道它发生在哪里的崩溃.任何帮助将不胜感激.我既不使用"android:animateLayoutChanges ="true"
基本上我曾尝试合并这两个不同的GitHub项目,
我的文件链接如下,来自pastbin,
android android-viewholder recycler-adapter android-recyclerview
我有Recycler Viewer,它显示来自Fire Base db的数据,但是初始List包含大约4k个元素.我试图只显示前15个元素,而不是等待加载完整列表,但不知道如何做到这一点.
我试图通过Subscriber获取(x)元素但是它不会提高读取性能(它仍然等待来自Firebase DB的4k元素).如何加快这个?
@Override
public void onBindViewHolder(final ListContentFragment.ViewHolder holder, int position) {
modelInterface.getDataFromFireBase("FinalSymbols")
.take(15)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<DataSnapshot>() {
@Override
public void accept(DataSnapshot dataFromDb) throws Exception {
//update TextView inside Recycler Viewer
holder.name.setText(dataFromDb.child(String.valueOf(holder.getAdapterPosition())).child("description").getValue().toString());
holder.description.setText(dataFromDb.child(String.valueOf(holder.getAdapterPosition())).child("categoryName").getValue().toString());
}
}
);
}
Run Code Online (Sandbox Code Playgroud)
@Override
public Flowable<DataSnapshot> getDataFromFireBase(final String childName) {
return Flowable.create(new FlowableOnSubscribe<DataSnapshot>() {
@Override
public void subscribe(final FlowableEmitter<DataSnapshot> e) throws Exception {
databaseReference.child(childName).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
e.onNext(dataSnapshot);
e.onComplete();
}
@Override …Run Code Online (Sandbox Code Playgroud) mvp observable firebase recycler-adapter firebase-realtime-database
我正在java.lang.IndexOutOfBoundsException: Inconsistency detected使用RecyclerView,但是只有在我似乎将其扔掉时才使用。当我滚动得足够慢时,它不会崩溃。
我将基本适配器用于许多其他子类,但是只有某些子类会崩溃。知道为什么会这样吗?
编辑
我发现发生这种情况的原因是因为getItemCount()更改取决于页脚加载视图的状态。我相信这会导致更改和滚动时出现不一致。
我通过始终在getItemCount()中的页眉/页脚加载视图返回2个额外的项来进行测试。而不是根据其状态动态计算计数。解决此问题的好方法是什么?
我的适配器
public abstract class BaseRecyclerAdapter<T>
extends RecyclerView.Adapter<RecyclerView.ViewHolder>
implements LoadingAndErrorViewHolder.LoadingViewHolderListener {
public static final int STATUS_HIDDEN = 0;
public static final int STATUS_LOADING = 1;
public static final int STATUS_ERROR = 2;
protected static final int TYPE_HEADER_LOADING = 0;
protected static final int TYPE_FOOTER_LOADING = 1;
protected static final int TYPE_NORMAL = 2;
private static final int POSITION_TYPE_HEADER_LOADING = 0;
private BaseRecyclerAdapterListener mBaseRecyclerAdapterListener;
private final List<T> mBackingList = …Run Code Online (Sandbox Code Playgroud) android indexoutofboundsexception recycler-adapter android-recyclerview
我想在RecyclerView中更新一个项目。该项目只是持有isFavourite标志的POJO bean 。用户可以单击项目并设置/取消收藏。我已经用DiffUtil回调实现了adater。有一个回调方法,boolean areContentsTheSame (int oldItemPosition, int newItemPosition)但在我的情况下,旧项目和新项目是同一对象,因此没有可比较的内容(equals方法返回true)。我应该保存先前的标志值,然后检查更改还是任何简单的解决方案?
我想RecyclerView从数据集中获取项目的位置RecyclerView.我的数据集中的每个项目都包含唯一的ID.我想RecyclerView在数据集中的id中找到项目的适配器位置.
我的数据集类如下所示.
class dataset {
int id;
JSONArray linked;
int type;
....
}
Run Code Online (Sandbox Code Playgroud)
我添加TextView或EditText到RecyclerView根据类型.
最终目标:我RecyclerView可以拥有多个EditText并且TextViews是独立的(尽管TextView将有一个EditText与其相关联的id的字段).当我点击时TextView,我将获得EditText(数据集)的id 来从中获取数据.我想从那些id中EditText的项目中获取相应的文本RecyclerView.如果我可以从数据集中获取适配器位置,我可以使用
recyclerview.getChildAt(position);
Run Code Online (Sandbox Code Playgroud)
但是没有办法从数据集中获取适配器位置.
我有一个带有多个视图的recyclerView,其中每一行都是recyclerView.当我滚动recyclelerView时,在创建的每一行上都是滞后的.这是我的一些代码.在下面你可以看到main recyclerView的配置:
LinearLayoutManager mLayoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
mRvPromotions.setLayoutManager(mLayoutManager);
mRvPromotions.setItemViewCacheSize(20);
mRvPromotions.setDrawingCacheEnabled(true);
mRvPromotions.setHasFixedSize(true);
mRvPromotions.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
mRvPromotions.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)
你可以在下面看到在适配器中绑定的内部recyclerView的代码:
mRvPromotion.setLayoutManager(new GridLayoutManager(itemView.getContext(), 3));
mRvPromotion.setItemViewCacheSize(20);
mRvPromotion.setDrawingCacheEnabled(true);
mRvPromotion.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
adapter = new PlaylistPromotionsRVAdapter(new PlaylistModelCallBack(), new PlaylistPromotionVHFactory());
mRvPromotion.setAdapter(adapter);
adapter.submitList(getVM().getPlaylist());
Run Code Online (Sandbox Code Playgroud)
我用mRvPromotion.setNestedScrollingEnabled(false);和ViewCompat.setNestedScrollingEnabled(childRecyclerView, false);,但laggy行为存在的钢.对于加载图像,我使用了Fresco并调整了配置.如何防止滞后滚动?
编辑
这是我的适配器:
public class PlaylistRVAdapter extends ListAdapter<PlayListPromotionAndSlider, BaseViewHolder> {
private final PlaylistPageVHFactory mFactory;
private final PublishSubject<PlaylistSliderVHAction> mClickSliderPS = PublishSubject.create();
private final PublishSubject<PlaylistPromotionsVHAction> mClickPromotionPS = PublishSubject.create();
@Inject
PlaylistRVAdapter(@NonNull PlaylistPromotionModelCallBack diffCallback, PlaylistPageVHFactory factory) {
super(diffCallback);
mFactory = factory;
}
@NonNull
@Override
public BaseViewHolder onCreateViewHolder(@NonNull ViewGroup …Run Code Online (Sandbox Code Playgroud) android recycler-adapter android-recyclerview fresco nestedrecyclerview
我在应用中创建了可扩展的回收视图,如下所示
它具有父项目菜单类别,而类别具有子项目,如图所示
以下是我的父适配器代码的一部分。
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
if (i > HEADER_COUNT - 1) {
FoodMenuItem foodMenuItem = foodMenuItems.get(i - HEADER_COUNT);
MenuViewHolder menuViewHolder = (MenuViewHolder) viewHolder;
//menuViewHolder.rvMenu.setLayoutManager(new LinearLayoutManager(viewHolder.itemView.getContext(), LinearLayoutManager.VERTICAL, false));
if (isVegOnly) {
List<Item> items = new ArrayList<>();
for (Item item : foodMenuItem.getItems()) {
if (item.getType().equalsIgnoreCase(Item.FOOD_TYPE_VEG)) {
items.add(item);
}
}
menuViewHolder.rvMenu.setAdapter(new FoodMenuChildRecycler(items, foodMenuParentListener, i, isAddAllowed));
menuViewHolder.tvNumItems.setText("(" + items.size() + " items)");
} else {
menuViewHolder.rvMenu.setAdapter(new FoodMenuChildRecycler(foodMenuItem.getItems(), foodMenuParentListener, i, isAddAllowed));
menuViewHolder.tvNumItems.setText("(" + foodMenuItem.getItems().size() + " items)"); …Run Code Online (Sandbox Code Playgroud) android recycler-adapter android-recyclerview expandablerecyclerview android-nestedscrollview
recycler-adapter ×10
android ×9
adapter ×1
animation ×1
firebase ×1
fresco ×1
java ×1
mvp ×1
observable ×1