【问题标题】:Custom adapter for FirebaseAdapter to a HorizontalScrollView or CarouselFirebaseAdapter 到 Horizo​​ntalScrollView 或 Carousel 的自定义适配器
【发布时间】:2018-06-09 04:54:45
【问题描述】:

我有一个简单的RecyclerView,在那里我展示了来自firebase 的所有产品,但现在我想在Carousel 上展示它们,就像这样Library,问题是我的@ 上都有所有产品987654326@ 类,我想创建一个自定义的Adapter 将产品作为Carousel

首先我得到的产品如下:

FirebaseRecyclerOptions< CardPOJO > options =
            new FirebaseRecyclerOptions.Builder< CardPOJO >()
                    .setQuery(products_ref, CardPOJO.class)
                    .build();

我将它存储在options,然后我创建Adapter

FirebaseRecyclerAdapter adapter = new   FirebaseRecyclerAdapter< CardPOJO, CardHolder>(options) {
        @Override
        public CardHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            //inflate the single recycler view layout(item)
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.card_product, parent, false);
            int width = parent.getMeasuredWidth() / 2;
            width -= mContext.getResources().getDimensionPixelSize(R.dimen._8sdp);
            final CardHolder cardViewHolder = new CardHolder(view,width);
            return cardViewHolder;
        }

        @Override
        public void onDataChanged() {
            super.onDataChanged();
            tv.setVisibility(getItemCount() == 0 ? View.VISIBLE : View.GONE);
        }

        @Override
        protected void onBindViewHolder(CardHolder holder, int position, final CardPOJO model) {
            holder.state.setText(model.getState());
            holder.cardName.setText(model.getName());
            switch (model.getState()){
                case "free":
                    //Img free
                    break;
                case "not_free":
                    //Img not free
                    break;
                default:
                    break;
            }
            holder.view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(model.getState().equals("free")){
                       //stuff
                    }
                    else{
                       //stuff
                        }
                        root_ref.child("PurchasedProducts").child(currentuser).addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                //stuff
                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {

                            }
                        });
                    }

                }
            });


        }
    };
    adapter.startListening();
    products_recycler.setAdapter(adapter);

我的.xml 有一个像这样的RecyclerView

<android.support.v7.widget.RecyclerView

        android:id="@+id/recycler_view_chooseCard"

        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        />

所以我的问题是,我该如何更改它以放置 Carousel 并像示例一样使用 in.goodiebag.carouselpicker.CarouselPicker 而不是 RecyclerView

我也可以将所有这些代码移到另一个代码中以使其干净吗?

注意

当我尝试实现 CourouselPicker 时,它会这样说:

设置适配器 (android.support.v4.view.PagerAdapter) 在 CarouselPicker 中无法应用 到 (com.firebase.ui.database.FirebaseRecyclerAdapter)

到目前为止我尝试了什么?

我把RecyclerView改成了

<in.goodiebag.carouselpicker.CarouselPicker
            android:id="@+id/carousel"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="20dp"
            android:layout_marginTop="20dp"
            android:background="#CCC"
            app:items_visible="three" />

我初始化了它:carouselPicker = (CarouselPicker) findViewById(R.id.carousel);

然后我尝试将.setAdapter()FireBaseAdapter 放在一起,但它们不兼容...

carouselPicker.setAdapter(adapter);

如果很难做到这一点,请阅读本文

如果那太宽泛了,而且用ViewPager 和那些东西来制作它太难了,是否可以创建一个像旋转木马一样的RecyclerView?您将物品水平放置,然后您看到中间的物品比其他物品大。

【问题讨论】:

  • 为什么要投反对票?如果你对某人投反对票,你可以说出原因,这样 OP 就不会再这样做了;)
  • 如果 carouselPicker.setAdapter(adapter); 不起作用,那么最好只使用自定义适配器而不是 firebaserecycleradapter
  • 这就是我要的,如何创建不同的适配器而不是使用 firebaserecycleradapter
  • 看到你的评论here。看起来@SUPERCILEX 的答案涵盖了所有内容(+1)。
  • @AL。感谢您来到这里,但是您知道获得这些物品的另一种方法吗?我的意思是,我使用FirebaseAdapter 很酷,但是就像现在一样,我想把这些项目放在 Horizo​​ntalScrollView 或 Carousel 上,我不能把它们放在 RecyclerView 或类似的东西上,你知道吗另一种方法呢?从现在开始,我有一个正常的列表,它可以正确显示数据,但现在我想把它放在一个更好的 UI 上,但我工作得很少,所以如果你知道另一种方法,可以随意放置答案:D

标签: android firebase firebase-realtime-database android-adapter firebaseui


【解决方案1】:

CarouselPicker 实际上是 ViewPager,这有点可悲。无论如何,RecyclerView 适配器和 PagerAdapter 是两个完全不同的东西,不要混用。您基本上必须进行定制——有两种选择。

在我看来,第一个是更简单更好的用户体验:只是不要让它成为实时的。如果您要在对话框中显示该视图,而用户只是短暂地与之交互,那么当轮播更新时没有动画和 RecyclerView 的所有优点时,它会令人困惑。它看起来像这样:

query.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snapshot) {
        List<CarouselPicker.PickerItem> items = new ArrayList<>();
        for (DataSnapshot child : snapshot.getChildren()) {
            CardPOJO card = child.getValue(CardPOJO.class);
            // Use card
            items.add(new CarouselPicker...);
        }
        mCarouselPicker.setAdapter(new CarouselPicker.CarouselViewAdapter(Activity.this, items, 0));
    }

    // ...
}

如果你真的希望它是实时的,你可以像这样使用FirebaseArray

final ObservableSnapshotArray<CardPOJO> cards = new FirebaseArray(query, new ClassSnapshotParser<>(CardPOJO.class));
cards.addChangeEventListener(new ChangeEventListener() {
    @Override
    public void onDataChanged() {
        List<CarouselPicker.PickerItem> items = new ArrayList<>();
        for (CardPOJO card : cards) {
            // Use card
            items.add(new CarouselPicker...);
        }
        mCarouselPicker.setAdapter(new CarouselPicker.CarouselViewAdapter(Activity.this, items, 0));
    }
})

希望这会有所帮助!

【讨论】:

  • 我不会在对话框中显示该信息,我会在库上放置一个 .gif 的 Activity,它只是为了显示轮播,我将在 Activity 上显示为列表
  • 如果我想实时进行,那一堆代码应该放在哪里?如果我已经准备好我的适配器?
  • 我尝试了实时解决方案,是的,它显示为轮播,但问题是我喜欢重复的东西,对吧?我有 FirebaseAdapter,我在其中编写了所有 onBindViewHolder onCreateViewHolder 等,使用它我无法使用它,对吧?
  • 是的,我的代码将替换适配器,因为您使用的是轮播。请务必查看他们的文档:github.com/GoodieBag/CarouselPicker/blob/master/README.md#java-.
  • 如果我不使用这个轮播,我不能像现在在 firebase 适配器中那样使用 recyclerview 自定义适配器吗?我的意思是,从现在开始我有一个简单的列表视图,但我想让它变得很酷,所以我想做一个水平滚动视图或你知道的东西?就像我现在通过它的状态(免费,not_free)来区分的那样,我可以放置一个或另一个图像,但是像旋转木马一样水平放置?你找到我了吗?
猜你喜欢
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多