2017-02-22 84 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 поле под названием «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")); 

Но это не заказ ничего