我有一个简单的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
吗?你有水平的项目,然后中间的项目你看到它比休息更大。
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));
}
})
希望这可以帮助!