gpt4 book ai didi

android - FirebaseRecyclerAdapter 无法将第一个布局识别为位置

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:06 26 4
gpt4 key购买 nike

我的标题有点难以理解,但基本上当我将项目添加到我的数据库时,它应该显示在 RecyclerView 中。现在在我的 RecyclerView 中我有两个布局,但问题是我的数据库的第一项在我的其他布局中落后于我的第一项。因此,如果我的数据库中有 3 个项目,它只显示数据库中的 2 个项目,第一个项目隐藏在 RecyclerView 中我的第一个项目后面,这是一个完全不使用数据库的不同布局。

这是我的代码:

 FirebaseRecyclerOptions<Event> firebaseRecyclerOptions = new FirebaseRecyclerOptions.Builder<Event>()
.setQuery(query1, Event.class).build();
AccAdapter = new FirebaseRecyclerAdapter<Event, RecyclerView.ViewHolder>(firebaseRecyclerOptions){

final static int TYPE_HEADER = 0;
final static int TYPE_ITEM = 1;


@Override
public int getItemViewType(int position) {
if (position == 0) return TYPE_HEADER;
return TYPE_ITEM;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

if (viewType == TYPE_HEADER){
View view = LayoutInflater.from(getActivity()).inflate(R.layout.recycler_view_row_add_items,
parent, false);
return new ProdudctHolder3(view);
} else {
View view = LayoutInflater.from(getActivity()).inflate(R.layout.recycler_view_row_acc,
parent, false);
return new ProductHolder2(view);
}
}

@Override
protected void onBindViewHolder(final RecyclerView.ViewHolder holder, int position, final Event model) {
if (holder instanceof ProdudctHolder3){
((ProdudctHolder3) holder).addBackground.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(getActivity(), AccAddItems.class ));
}
});
} else{

final ProductHolder2 productHolder2 = (ProductHolder2) holder;


productHolder2.mName.setText(model.getName());
productHolder2.view.setBackgroundResource(getBackgroundDrawable(Integer.valueOf(model.getProductAmount())));
productHolder2.mbackground.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

dialog = new Dialog(getActivity());
dialog.setContentView(R.layout.popup_edit_product);

SeekBar amountSeekBar = dialog.findViewById(R.id.amountSeekBar);
amountSeekBar.setMax(100);
amountSeekBar.setProgress(Integer.valueOf(model.getProductAmount()));
amountSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
progress = i;
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {
getRef(holder.getAdapterPosition()).child("productAmount").setValue(String.valueOf(progress));
dialog.dismiss();

}
});

dialog.show();

}
});

productHolder2.mbackground.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
final PopupMenu popupMenu = new PopupMenu(getActivity(), productHolder2.mbackground);

popupMenu.inflate(R.menu.menu_acc);
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
switch (menuItem.getItemId()){
case R.id.deleteProduct:
getRef(productHolder2.getAdapterPosition()).removeValue();
popupMenu.dismiss();
return true;

default:
return false;
}
}
});

popupMenu.show();

return true;
}
});

}
}

};

mAccRecyclerViewRef.setAdapter(AccAdapter);

我的两个产品持有人

私有(private)类 ProdudctHolder3 扩展了 RecyclerView.ViewHolder{

    private RelativeLayout addBackground;

public ProdudctHolder3(View itemView) {
super(itemView);
addBackground = itemView.findViewById(R.id.mBackground2);
}
}

private class ProductHolder2 extends RecyclerView.ViewHolder{

private TextView mName;
private RelativeLayout mbackground;
private View view;

public ProductHolder2(View itemView) {
super(itemView);

mName = itemView.findViewById(R.id.ItemName);
mbackground = itemView.findViewById(R.id.mBackground1);
view = itemView.findViewById(R.id.amountIndicator);

}
}

最佳答案

理想的解决方案是在单个 RecyclerView 上设置两个适配器,但不幸的是,这是不可能的。但是,您可以制作一个处理两种类型项目的自定义适配器。我将通过举个例子来解释这一点。

假设您需要显示两种类型的对象,人类外星人。您的对象需要完全不同的布局和完全不同的 ViewHolders。请查看下面的 ViewHolders 代码:

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static class HumanViewHolder extends RecyclerView.ViewHolder {
public HumanViewHolder(View itemView) {
super(itemView);

//Prepare your ViewHolder
}

public void bind(Human human) {

//Display your human object
}
}

private static class AlienViewHolder extends RecyclerView.ViewHolder {
public AlienViewHolder(View itemView) {
super(itemView);

//Prepare your ViewHolder
}

public void bind(Alien alien) {

//Display your alien object
}
}
}

首先,您需要向适配器添加两个不同的常量来表示两种类型的 View :

private static final int ITEM_TYPE_HUMAN;
private static final int ITEM_TYPE_ALIEN;

为简单起见,我们还假设您将对象存储在列表中:

private List<Object> items = new ArrayList<>();

public MyAdapter(List<Object> items) {
this.items.addAll(items);

//Other stuff if needed
}

现在,您需要做的第一件事就是实现 getItemViewType() 方法:

@Override
public int getItemViewType(int position) {
if (items.get(position) instanceof Human) {
return ITEM_TYPE_HUMAN;
} else {
return ITEM_TYPE_ALIEN;
}
}

其次,您需要像这样在 onCreateViewHolder() 方法中使用项目类型:

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());

if (viewType == ITEM_TYPE_HUMAN) {
View view = layoutInflater.inflate(R.layout.item_human, parent, false);

return new HumanViewHolder(view);
} else {
View view = layoutInflater.inflate(R.layout.item_alien, parent, false);

return new AlienViewHolder(view);
}
}

最后,您只需要像这样绑定(bind)适当的 View 持有者:

@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
Object item = items.get(position);

if (viewHolder instanceof HumanViewHolder) {
((HumanViewHolder) viewHolder).bind((Human) item);
} else {
((AlienViewHolder) viewHolder).bind((Alien) item);
}
}

关于android - FirebaseRecyclerAdapter 无法将第一个布局识别为位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50777733/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com