2017-02-22 52 views
1

我正在制作一个应用程序,显示来自FireBase的一周的日子,问题是我把它们搞砸了,我希望它们被排序。对FirebaseRecyclerAdapter排序

我已搜查,在许多地方,并把订单与适配器的排序方法:

Sort listview with array adapter

的问题是,因为我用的是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()); 
     } 
    } 


} 

}

和碎片,我使用它:

@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; 
} 

谢谢!

+0

考虑的http:// stackoverflow.com/questions/42249524/sorting-items-position-using-firebaserecycleradapter/42319463#42319463 – Alexander

回答

2

的原因只有一个项目显示出来的是,你只调用bindViewHolder条件:

if (this.getItemCount() == position + 1) { 
    viewHolder.bindDatos(dias); 
} 

删除条件和其他人将现身过。

要获得排序和筛选结果,您必须将查询传递到FirebaseRecyclerAdapter构造函数中,您现在正在传入DatabaseReference。因此,添加一个构造函数,以您的适配器,需要一个Query

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

然后用一个查询,订单和过滤器调用它:

adapter = new MyFireAdapterDiasFiestaRecyclerView(
    DiaFiestaMeta.class, 
    layout_that_you_use, 
    MyFireViewHolder.class, 
    ref.orderByChild("property_to_sort_and_filter_on").equalTo("value_to_filter_on") 
); 
0

我做了什么,你告诉我的。为此,我在FireBase数据库中包含了一个名为“订单”的字段。该场将在该节点将进行排序:

{ 
 
    "descripcion" : "desc1", 
 
    "diasFiestas" : { 
 
    "Domingo5deMarzo2017" : { 
 
     "orden" : 4, 
 
     "tituloDiaFiesta" : "Domingo 5 de Marzo", 
 
     "uidDiaFiesta" : "Domingo5deMarzo2017" 
 
    }, 
 
    "Jueves2deMarzo2017" : { 
 
     "orden" : 1, 
 
     "tituloDiaFiesta" : "Jueves 2 de Marzo", 
 
     "uidDiaFiesta" : "Jueves2deMarzo2017" 
 
    }, 
 
    "Jueves9deMarzo2017" : { 
 
     "orden" : 8, 
 
     "tituloDiaFiesta" : "Jueves 9 de Marzo", 
 
     "uidDiaFiesta" : "Jueves9deMarzo2017" 
 
    }, 
 
    "Lunes6deMarzo2017" : { 
 
     "orden" : 5, 
 
     "tituloDiaFiesta" : "Lunes 6 de Marzo", 
 
     "uidDiaFiesta" : "Lunes6deMarzo2017" 
 
    },

在我的片段:

adaptadorDiasFiestas = new MyFireAdapterDiasFiestaRecyclerView(DiaFiestaMeta.class, R.layout.fila_diasfiesta_layout, MyFireAdapterDiasFiestaRecyclerView.MyFireViewHolder.class, mDataBaseDiasFiestaSelRef.orderByChild("orden")); 

但它不会下令任何