【问题标题】:Sort a FirebaseRecyclerAdapter对 FirebaseRecyclerAdapter 进行排序
【发布时间】:2017-02-22 17:30:46
【问题描述】:

我正在制作一个显示来自 FireBase 的星期几的应用程序,问题是我把它们弄乱了,我希望它们被排序。

找了很多地方,用适配器的排序方法排序:

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

谢谢!

【问题讨论】:

标签: android firebase firebase-realtime-database firebaseui


【解决方案1】:

只显示一项的原因是你只有条件地调用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")
);

【讨论】:

    【解决方案2】:

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

    {
      "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"));
    

    但它没有订购任何东西

    【讨论】:

      猜你喜欢
      • 2017-03-15
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-05
      • 2018-08-02
      • 2015-04-11
      相关资源
      最近更新 更多