Android 对FirebaseRecyclerAdapter进行排序

Android 对FirebaseRecyclerAdapter进行排序,android,firebase,firebase-realtime-database,firebaseui,Android,Firebase,Firebase Realtime Database,Firebaseui,我正在制作一个应用程序,显示一周中来自FireBase的几天,问题是我把它们搞砸了,我希望它们能被分类 我已经搜索了很多地方,并使用适配器的排序方法进行排序: public class MyFireAdapterDiasFiestaRecyclerView extends FirebaseRecyclerAdapter<DiaFiestaMeta, MyFireAdapterDiasFiestaRecyclerView.MyFireViewHolder> implements

我正在制作一个应用程序,显示一周中来自FireBase的几天,问题是我把它们搞砸了,我希望它们能被分类

我已经搜索了很多地方,并使用适配器的排序方法进行排序:

public class MyFireAdapterDiasFiestaRecyclerView extends FirebaseRecyclerAdapter<DiaFiestaMeta, MyFireAdapterDiasFiestaRecyclerView.MyFireViewHolder>
    implements View.OnClickListener {
private View.OnClickListener listener;
private List<DiaFiestaMetaFecha> dias;
private static List<TextView> views ;
private DiaFiestaMetaFecha fechaDia;

public MyFireAdapterDiasFiestaRecyclerView(Class<DiaFiestaMeta> modelClass, int modelLayout, Class<MyFireViewHolder> viewHolderClass, DatabaseReference ref) {
    super(modelClass, modelLayout, viewHolderClass, ref);
    dias = new ArrayList<>();
    views = new ArrayList<>();

}

@Override
public MyFireViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.fila_diasfiesta_layout, viewGroup, false);
    itemView.setOnClickListener(this);
    MyFireViewHolder holder = new MyFireViewHolder(itemView);
    return holder;
}

public void setOnClickListener(View.OnClickListener listener) {
    this.listener = listener;
}

@Override
public void onClick(View view) {
    if (listener != null)
        listener.onClick(view);
}

@Override
protected void populateViewHolder(MyFireViewHolder viewHolder, DiaFiestaMeta modelo, int position) {
    fechaDia = new DiaFiestaMetaFecha(modelo.getUidDiaFiesta(), modelo.getTituloDiaFiesta());
    dias.add(fechaDia);
    if (this.getItemCount() == position + 1) {
        viewHolder.bindDatos(dias);
    }
}

public static class MyFireViewHolder extends RecyclerView.ViewHolder {
    private TextView textoTv;
    private int num;



    public MyFireViewHolder(View itemView) {
        super(itemView);
        textoTv = (TextView) itemView.findViewById(R.id.tvTituloDiaFiesta);

        views.add(textoTv);

    }

    public void bindDatos(String titulo) {
        textoTv.setText(titulo);
    }

    public void bindDatos(List<DiaFiestaMetaFecha> dias) {
        burbuja(dias);
        for (int i = 0; i < dias.size(); i++) {
            views.get(i).setText(dias.get(i).getTituloDiaFiesta());
        }
    }


}

问题是,我不能使用此方法,因为我使用的FirebaseRecyclerAdapter是从适配器派生的,它没有排序方法

最后,我能够对适配器的数据进行排序,但当我显示它时,只显示最后一个元素,而不显示前一个元素

我把代码放在:

适配器:

public class MyFireAdapterDiasFiestaRecyclerView extends FirebaseRecyclerAdapter<DiaFiestaMeta, MyFireAdapterDiasFiestaRecyclerView.MyFireViewHolder>
    implements View.OnClickListener {
private View.OnClickListener listener;
private List<DiaFiestaMetaFecha> dias;
private static List<TextView> views ;
private DiaFiestaMetaFecha fechaDia;

public MyFireAdapterDiasFiestaRecyclerView(Class<DiaFiestaMeta> modelClass, int modelLayout, Class<MyFireViewHolder> viewHolderClass, DatabaseReference ref) {
    super(modelClass, modelLayout, viewHolderClass, ref);
    dias = new ArrayList<>();
    views = new ArrayList<>();

}

@Override
public MyFireViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.fila_diasfiesta_layout, viewGroup, false);
    itemView.setOnClickListener(this);
    MyFireViewHolder holder = new MyFireViewHolder(itemView);
    return holder;
}

public void setOnClickListener(View.OnClickListener listener) {
    this.listener = listener;
}

@Override
public void onClick(View view) {
    if (listener != null)
        listener.onClick(view);
}

@Override
protected void populateViewHolder(MyFireViewHolder viewHolder, DiaFiestaMeta modelo, int position) {
    fechaDia = new DiaFiestaMetaFecha(modelo.getUidDiaFiesta(), modelo.getTituloDiaFiesta());
    dias.add(fechaDia);
    if (this.getItemCount() == position + 1) {
        viewHolder.bindDatos(dias);
    }
}

public static class MyFireViewHolder extends RecyclerView.ViewHolder {
    private TextView textoTv;
    private int num;



    public MyFireViewHolder(View itemView) {
        super(itemView);
        textoTv = (TextView) itemView.findViewById(R.id.tvTituloDiaFiesta);

        views.add(textoTv);

    }

    public void bindDatos(String titulo) {
        textoTv.setText(titulo);
    }

    public void bindDatos(List<DiaFiestaMetaFecha> dias) {
        burbuja(dias);
        for (int i = 0; i < dias.size(); i++) {
            views.get(i).setText(dias.get(i).getTituloDiaFiesta());
        }
    }


}
公共类MyFireAdapterDiasfieStareCyclView扩展FirebaseRecyclerAdapter
实现View.OnClickListener{
private View.OnClickListener监听器;
私人名单;
私有静态列表视图;
私人日记;
公共MyFireAdapterDiasfieStareCyclView(类modelClass、int modelLayout、类viewHolderClass、数据库参考ref){
超级(modelClass、modelLayout、viewHolderClass、ref);
dias=新的ArrayList();
视图=新的ArrayList();
}
@凌驾
公共MyFireViewHolder onCreateViewHolder(视图组视图组,int-viewType){
View itemView=LayoutInflater.from(viewGroup.getContext())。充气(R.layout.fila_diascaesta_布局,viewGroup,false);
setOnClickListener(这个);
MyFireViewHolder=新的MyFireViewHolder(itemView);
报税表持有人;
}
public void setOnClickListener(View.OnClickListener侦听器){
this.listener=listener;
}
@凌驾
公共void onClick(视图){
if(侦听器!=null)
onClick(视图);
}
@凌驾
受保护的空白填充视图支架(MyFireViewHolder视图支架,DiaFiestaMeta modelo,内部位置){
fechaDia=new DiaFiestaMetaFecha(modelo.getuiddiafeesta(),modelo.getitulodiafiesta());
D.添加(费查迪亚);
if(this.getItemCount()==位置+1){
视图持有者。bindDatos(dias);
}
}
公共静态类MyFireViewHolder扩展了RecyclerView.ViewHolder{
私有文本视图文本电视;
私有整数;
公共MyFireViewHolder(查看项目视图){
超级(项目视图);
textoTv=(TextView)itemView.findViewById(R.id.tvititulodiafiesta);
添加视图(textoTv);
}
公共void bindDatos(字符串titulo){
textoTv.setText(titulo);
}
公共无效数据(列表DIA){
burbuja(dias);
对于(int i=0;i
}

还有我使用它的片段:

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    uidsFiestas = getUidsFiestas();
    //Por defecto mostramos la ultima fecha
    uidFiestaSeleccionada = getUltimaFiesta();
    adaptadorFiestas = new ArrayAdapter<String>(getContext(), android.R.layout.simple_spinner_item, uidsFiestas);
    //Ponemos el uidFiestaSeleccionada el primero para que nos lo muestre
    adaptadorFiestas.remove(uidFiestaSeleccionada);
    adaptadorFiestas.insert(uidFiestaSeleccionada,0);
    mDataBaseDiasFiestaSelRef = mDataBaseFiestasRef.child(uidFiestaSeleccionada).child("diasFiestas");
    adaptadorDiasFiestas = new MyFireAdapterDiasFiestaRecyclerView(DiaFiestaMeta.class, R.layout.fila_diasfiesta_layout, MyFireAdapterDiasFiestaRecyclerView.MyFireViewHolder.class, mDataBaseDiasFiestaSelRef);
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fiestas_layout, container, false);

    ButterKnife.bind(this, view);
    spFiestas.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            TextView textoTv = (TextView) view;
            uidFiestaSeleccionada = textoTv.getText().toString();
            //fiestaSeleccionada = crearFiesta(uidFiestaSeleccionada);
            mDataBaseDiasFiestaSelRef = mDataBaseFiestasRef.child(uidFiestaSeleccionada).child("diasFiestas");
            adaptadorDiasFiestas = new MyFireAdapterDiasFiestaRecyclerView(DiaFiestaMeta.class, R.layout.fila_diasfiesta_layout, MyFireAdapterDiasFiestaRecyclerView.MyFireViewHolder.class, mDataBaseDiasFiestaSelRef);
            adaptadorViejoDiasFiestas = (MyFireAdapterDiasFiestaRecyclerView) recView.getAdapter();
            recView.setAdapter(adaptadorDiasFiestas);

            if (adaptadorViejoDiasFiestas!=null)
                adaptadorViejoDiasFiestas.cleanup();
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
        }
    });
    spFiestas.setAdapter(adaptadorFiestas);
    setHasOptionsMenu(true);

    recView.setHasFixedSize(true);
    manager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
    recView.setLayoutManager(manager);
    recView.setAdapter(adaptadorDiasFiestas);
    return view;
}
@覆盖
公共事务主任(活动){
超级转速计(活动);
uidsFiestas=getUidsFiestas();
//最后一次失败
UIDFiestaselectionada=getUltimaFiesta();
adaptedorfiestas=newarrayadapter(getContext(),android.R.layout.simple\u spinner\u item,uidsFiestas);
//这是一个非常重要的问题
适配器拆卸(UIDFestaleccionada);
适配器固件插入(UIDFestaleccionada,0);
mDataBaseDiasFiestaSelRef=mdatabasefiestaref.child(uidfiestaselectionada.child)(“diasFiestas”);
AdapterDiasFiestas=新的MyFireAdapterDiasFiestaRecyclView(DiaFiestaMeta.class,R.layout.fila_diasfiesta_layout,MyFireAdapterDiasFiestaRecyclView.MyFireViewHolder.class,mDataBaseDiasFiestaSelRef);
}
@可空
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图=充气机。充气(R.layout.fiestas_布局,容器,假);
ButterKnife.bind(这个,视图);
setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、视图视图、整型位置、长id){
TextView textoTv=(TextView)视图;
UIDFiestaselectionada=textoTv.getText().toString();
//嘉年华=嘉年华(UIDFiestaselectionada);
mDataBaseDiasFiestaSelRef=mdatabasefiestaref.child(uidfiestaselectionada.child)(“diasFiestas”);
AdapterDiasFiestas=新的MyFireAdapterDiasFiestaRecyclView(DiaFiestaMeta.class,R.layout.fila_diasfiesta_layout,MyFireAdapterDiasFiestaRecyclView.MyFireViewHolder.class,mDataBaseDiasFiestaSelRef);
AdapterVieJoDiasFiestas=(MyFireAdapterDiasFieStareCyclView)recView.getAdapter();
recView.setAdapter(AdapterDiasFiestas);
if(adaptedorviejodiasfiestas!=null)
adaptedorviejodiasfiestas.cleanup();
}
@凌驾
未选择公共无效(AdapterView父级){
}
});
设置适配器(适配器);
设置选项菜单(真);
recView.setHasFixedSize(true);
manager=newlinearlayoutmanager(getContext(),LinearLayoutManager.VERTICAL,false);
recView.setLayoutManager(管理器);
recView.setAdapter(AdapterDiasFiestas);
返回视图;
}

谢谢

只有一个项目显示的原因是您只能有条件地调用
bindViewHolder

if (this.getItemCount() == position + 1) {
    viewHolder.bindDatos(dias);
}
移除该条件,其他条件也会出现

要获得经过排序和筛选的结果,您必须将查询传递到
FirebaseRecyclerAdapter
构造函数中,此时您正在传递
数据库引用。因此,向适配器添加一个构造函数,该构造函数接受一个
查询

public MyFireAdapterDiasFiestaRecyclerView(
    Class<DiaFiestaMeta> modelClass, 
    int modelLayout, 
    Class<MyFireViewHolder> viewHolderClass, 
    Query query) {
    ...

我已经照你说的做了。为此,我在FireBase数据库中包含了一个名为“订单”的字段。此字段将用于对节点进行排序:

{
“描述”:“描述1”,
“流亡者”:{
“Domingo5deMarzo2017”:{
“奥登”:4,
“提图洛迪亚节”:“多明戈5德马尔佐”,
“uidDiaFiesta”:“Domingo5deMarzo2017”
},
“Jueves2deMarzo2017”:{
“奥登”:1,
“提图洛迪亚耶斯塔”:“朱庇斯2德马尔佐”,
“uidDiaFiesta”:“Jueves2deMarzo2017”
},
“诀