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

问题描述 投票:0回答:1

我有一个简单的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);

而我的.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时,它说:

CarouselPicker中的setAdapter(android.support.v4.view.PagerAdapter)无法应用于(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吗?你有水平的项目,然后中间的项目你看到它比休息更大。

android firebase firebase-realtime-database android-adapter firebaseui
1个回答
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));
    }
})

希望这可以帮助!

© www.soinside.com 2019 - 2024. All rights reserved.