使用自定义适配器

时间:2017-01-20 14:52:05

标签: java android sorting android-recyclerview firebase-realtime-database

我有一个问题,很多人有,但我不明白我怎么能摆脱它。 在我的情况下请帮助我,不要标记为重复。 我有一个与firebase链接的recyclerview。 我的recyclerview有一个名为MyAdapter的自定义适配器:

public class MyAdapter extends RecyclerView.Adapter<MyHolder> implements Filterable {

Context c;
ArrayList<Studi> studi;
ArrayList<Studi> filterList;
CustomFilter filter;

public MyAdapter(Context c, ArrayList<Studi> studi) {
    this.c = c;
    this.studi = studi;
    this.filterList = studi;

}


@Override
public MyHolder onCreateViewHolder (ViewGroup parent, int viewType){
    View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.model, parent, false);
    MyHolder holder = new MyHolder(v);

    return holder;
}
@Override
public void onBindViewHolder (MyHolder holder, int position){
    String name = studi.get(position).getName();
    String desc = studi.get(position).getDescription();
    String prof = studi.get(position).getProfessione();
    String tel = studi.get(position).getTelefono();
    String coord1 = studi.get(position).getCoordinata1();
    String coord2 = studi.get(position).getCoordinata2();
    String distanza = studi.get(position).getDistanza();
    holder.nameTxt.setText(name);
    holder.descTxt.setText(desc);
    holder.profTxt.setText(prof);
    holder.telTxt.setText(tel);
    holder.pos1Txt.setText(coord1);
    holder.pos2Txt.setText(coord2);
    holder.distanza.setText(distanza);
}

@Override
public int getItemCount (){
    return (studi == null) ? 0 : studi.size();
}

//FILTER THING......................
public Filter getFilter() {
    if(filter == null)
    {
        filter=new CustomFilter(filterList,this);
    }
    return filter;
}}

所有项目都有一个textview里面写的字符串Distanza。此字符串是每个recyclerview项目的编号。 我需要将所有的recyclerview项目从低层重新排序到更高层(String Distanza的值)。

这是我用于arraylist的我的Studi课程:

public class Studi {

private String name;

private String description;
private String professione;
private String telefono;
private String coordinata1;
private String coordinata2;
private String distanza;

public void setDistanza(String distanza) {
    this.distanza = distanza;
}

public String getDistanza() {
    return distanza;
}

public String getCoordinata2() {
    return coordinata2;
}

public void setCoordinata2(String coordinata2) {
    this.coordinata2 = coordinata2;
}

public String getCoordinata1() {
    return coordinata1;
}

public void setCoordinata1(String coordinata1) {
    this.coordinata1 = coordinata1;
}



public String getProfessione() {
    return professione;
}

public void setProfessione(String professione) {
    this.professione = professione;
}

public String getTelefono() {
    return telefono;
}

public void setTelefono(String telefono) {
    this.telefono = telefono;
}

public Studi() {
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}}

所以最后,我需要在recyclelerview的顶部对那些返回低于其他值的getDistanza()值重新排序。 我该怎么做?我真的不知道,对不起,但我是新人。

2 个答案:

答案 0 :(得分:1)

您可以在将数据传递给MyAdapter之前对其进行排序。您可以使用sort类中的Collections方法。你会有这样的事情:

Collections.sort(studi, new Comparator<Studi>() {
    public int compare(Studi s1, Studi s2) {
            return s1.getDistanza() - s2.getDistanza();
    }
})

最后,无论何时过滤数据,它始终都会尊重getDistanza排序。

答案 1 :(得分:1)

在对recyclerView进行夸大时,不应对数据进行排序。现在你已经从firebase-database中获取了数据,你应该相应地使用你的查询来获得排序形式的结果。

如果您希望列表按距离递增(在您的情况下为distanza),请使用类似的查询

const query = itemsRef.orderByChild('distanza');

这将为您提供一个您不再需要排序的排序数组。

P.S。如果您希望recyclerView实时更改,请不要使用自定义适配器,而应使用firebaseRecyclerviewAdapter。