繁体   English   中英

使用自定义适配器重新订购Recyclerview项目

[英]Reorder Recyclerview items with custom adapter

我有很多人遇到的问题,但是我不明白如何摆脱它。 请为我提供帮助,请勿将其标记为重复。 我有一个与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;
}}

所有项目都在其中写入String Distanza的地方有一个textview。 该字符串是每个recyclerview项目的数字。 我需要将所有recyclerview项从低到高(字符串Distanza的值)重新排序。

这是我用于数组列表的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;
}}

因此,最后,我需要在返回的getDistanza()值低于其他值的那些代码中,在recyclerview的顶部对其进行重新排序。 我该怎么做? 我真的不知道,很抱歉,但是我是新来的。

您可以在将数据传递给MyAdapter之前对其进行MyAdapter 您可以使用Collections类中的sort方法。 您将具有以下内容:

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

最后,无论何时过滤数据,它都将始终遵循getDistanza排序。

在对recyclerView进行膨胀时,不应对数据进行排序。 实际上,既然您已经从firebase-database中获取数据,则应相应地使用查询以排序形式获得结果。

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

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

这将为您提供一个排序数组,您不再需要对其进行排序。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM