FirebaseAdapter到Horizo​​ntalScrollView或Carousel的自定义适配器

时间:2017-12-28 16:25:04

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

我有一个简单的RecyclerView,其中我展示了来自firebase的所有产品,但现在我想在Carousel上展示它们Library我的所有ChooseProduct.java课程都已完成,我想创建一个自定义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);

我的.xmlRecyclerView这样:

<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时,它说:

  

setAdapter   (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?你有水平的项目,然后中间的项目你看到它比休息更大。

1 个答案:

答案 0 :(得分:2)

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));
    }
})

希望这有帮助!