我正在创建一个应用程序,显示来自FireBase的一周中的日期,问题是我让它们搞砸了,我希望它们可以进行排序。
我在许多地方搜索并使用适配器的排序方法下订单:
问题在于我无法使用此方法,因为我使用的FirebaseRecyclerAdapter派生自一个没有sort方法的适配器。
最后,我能够对适配器的数据进行排序,但是当我显示它时,只显示最后一个元素而前一个元素不显示。
我把代码:
适配器:
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 :(得分: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")
);
答案 1 :(得分:0)
我做了你告诉我的事。为此,我在FireBase数据库中包含了一个名为&#34; order&#34;的字段。该字段将在其中对节点进行排序:
{
"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"
},
&#13;
在我的片段中:
adaptadorDiasFiestas = new MyFireAdapterDiasFiestaRecyclerView(DiaFiestaMeta.class, R.layout.fila_diasfiesta_layout, MyFireAdapterDiasFiestaRecyclerView.MyFireViewHolder.class, mDataBaseDiasFiestaSelRef.orderByChild("orden"));
但它没有订购任何东西