标签: recycler-adapter

最好的地方叫RecyclerView.Adapter.notifyItem*?

使用CursorLoader更新ListView是一种从数据库向UI显示数据的简单方法.模型修改传播到UI而没有额外的工作,可能不那么有效.

RecyclerView.adapter提供更多粒度的访问权限,允许例如指定删除特定项目的适配器.

但是,调用那些首选方法(notifyItem*),替换notifyDataSetChanged的最佳位置是什么?

显然,适配器不能观察contentProvider,否则它将不知道模型修改的性质(就像之前一样).

可以使用不同的模式,例如添加总线以发布来自提供者的修改,创建可以使用适配器的引用的单例模型,可以使用演示者(在L中引入),或者创建活动绑定服务.

这是一个常见的用例:同步进程在DB中插入一个条目(或者收到一个gcm通知,也在DB中插入一个条目),然后我希望通过调用notifyItemInserted来更新UI(如果已启动).在哪里拨打这个电话?

谢谢.

android recycler-adapter android-recyclerview

6
推荐指数
0
解决办法
439
查看次数

从底部添加动态RecyclerView添加

我正在使用最新的RecyclerView库来显示一个列表,其中包含一个选项,可以将项目添加到此列表中.该列表的顺序相反,因此最新的添加内容显示在底部.从顶部向回收者视图添加新项目时,会显示一个漂亮的动画,并自动滚动列表以显示最新项目.

但是,从底部添加新项目时,在动画新项目时,项目不会同样被推高.这会导致奇怪的行为,即添加新项目并且除非用户滚动到列表底部,否则无法看到动画.

作为临时修复,我强制循环器视图适配器在添加新项目后滚动到第一个位置.这不像从回收站视图顶部添加那样无缝,是否有适当的方法来实现它?

相应的代码如下:

la.addItem(0, msg);
layoutManager.scrollToPosition(0);
Run Code Online (Sandbox Code Playgroud)

animation android adapter recycler-adapter android-recyclerview

6
推荐指数
1
解决办法
1487
查看次数

ItemDecoration覆盖getItemOffsets()和动画

我申请的利润率等于我对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

6
推荐指数
2
解决办法
3999
查看次数

带有Scrapped或附加视图的GapWorker可能无法回收.isScrap:false isAttached:true

当我滚动我的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上得到类似的问题,但没有一个像下面的链接一样有用,

链接1

链接2

链接3

链接4

链接5

我不知道它发生在哪里的崩溃.任何帮助将不胜感激.我既不使用"android:animateLayoutChanges ="true"

基本上我曾尝试合并这两个不同的GitHub项目,

RV-适配器状态

RV-适配器不已

我的文件链接如下,来自pastbin,

行布局

回收者代码

我的适配器从两个不同的rv适配器合并

主适配器

android android-viewholder recycler-adapter android-recyclerview

6
推荐指数
1
解决办法
3002
查看次数

如何使用RxJava 2改进从Firebase数据库读取的Flowable <Object>数据?

我有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)

发布者 - 数据源(FireBase数据库)

@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

6
推荐指数
1
解决办法
327
查看次数

RecyclerView java.lang.IndexOutOfBoundsException:检测到不一致。无效的视图支架适配器位置。由于更改了getItemCount()

我正在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

6
推荐指数
1
解决办法
6682
查看次数

使用DiffUtil更新RecyclerView中的单个项目

我想在RecyclerView中更新一个项目。该项目只是持有isFavourite标志的POJO bean 。用户可以单击项目并设置/取消收藏。我已经用DiffUtil回调实现了adater。有一个回调方法,boolean areContentsTheSame (int oldItemPosition, int newItemPosition)但在我的情况下,旧项目和新项目是同一对象,因此没有可比较的内容(equals方法返回true)。我应该保存先前的标志值,然后检查更改还是任何简单的解决方案?

android recycler-adapter android-recyclerview

6
推荐指数
1
解决办法
1043
查看次数

从数据列表中查找RecyclerView中项目的位置

我想RecyclerView从数据集中获取项目的位置RecyclerView.我的数据集中的每个项目都包含唯一的ID.我想RecyclerView在数据集中的id中找到项目的适配器位置.

我的数据集类如下所示.

class dataset {
    int id;
    JSONArray linked;
    int type;
    ....
}
Run Code Online (Sandbox Code Playgroud)

我添加TextViewEditTextRecyclerView根据类型.

最终目标:我RecyclerView可以拥有多个EditText并且TextViews是独立的(尽管TextView将有一个EditText与其相关联的id的字段).当我点击时TextView,我将获得EditText(数据集)的id 来从中获取数据.我想从那些id中EditText的项目中获取相应的文本RecyclerView.如果我可以从数据集中获取适配器位置,我可以使用

recyclerview.getChildAt(position);
Run Code Online (Sandbox Code Playgroud)

但是没有办法从数据集中获取适配器位置.

java android recycler-adapter android-recyclerview

6
推荐指数
0
解决办法
752
查看次数

嵌套的RecyclerView与多视图滞后滚动

我有一个带有多个视图的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

6
推荐指数
1
解决办法
961
查看次数

嵌套的Expandable RecyclerView滞后于“展开”和“折叠”,子项目数量过多

我在应用中创建了可扩展的回收视图,如下所示

它具有父项目菜单类别,而类别具有子项目,如图所示

在此处输入图片说明

以下是我的适配器代码的一部分。

 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

6
推荐指数
0
解决办法
576
查看次数