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