Мне нужна помощь, чтобы отобразить отсортированные данные «Документа» по списку «Коллекция» в RecyclerView (полученные данные не отсортированы по списку, #AskFirebase) - PullRequest
1 голос
/ 11 октября 2019

Изображение базы данных коллекции адресов

Изображение базы данных списка документов

Я хочу отобразить отсортированные данные в соответствии с моим списком в RecyclerView (IЯ могу получить данные, но они не отсортированы согласно списку моих коллекций). Или я отсортировал список адресов коллекции в Firestore и хочу получить отсортированные данные из списка документов Firestore. Пожалуйста, найдите приложенное изображение базы данных Firestore и код Java для подробностей.

public class ViewSelectedActivity extends AppCompatActivity {

    private RecyclerView addressRecyclerView;
    private FirebaseFirestore fireStoreDb = FirebaseFirestore.getInstance();
    public static AddressAdapter addressActivityAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_selected);

        addressRecyclerView = findViewById(R.id.address_recycler_view);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);

        addressRecyclerView.setLayoutManager(layoutManager);

        final List<AddressModel> addressModelList1 = new ArrayList<>();
        addressModelList1.clear();

        addressModelList1.add(new AddressModel("Ravi11111", "Fist1", "City1", "111111", "111"));//Manual address list is working fine.
        addressModelList1.add(new AddressModel("222", "Fist1", "222", "111111", "111"));
        addressModelList1.add(new AddressModel("Ravi11111", "333", "City33", "111111", "111"));

        fireStoreDb.collection("Selected_user").document("Address").get()
                .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                    @Override
                    public void onComplete(@NonNull final Task<DocumentSnapshot> task) {
                        if (task.isSuccessful()) {
                            for (long x = 1; x <= (long) task.getResult().get("Address_Size"); x++) {
                                String addressId = task.getResult().getString("Address_0" + x);

                                fireStoreDb.collection("AddressCollection").document(addressId).get()
                                        .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                                            @Override
                                            public void onComplete(@NonNull Task<DocumentSnapshot> task1) {
                                                if (task1.isSuccessful()) {
                                                    addressModelList1
                                                            .add(new AddressModel(task1.getResult().getString("Full_Name")
                                                                    , task1.getResult().getString("House_No")
                                                                    , task1.getResult().getString("City")
                                                                    , task1.getResult().getString("Pincode")
                                                                    , task1.getResult().getString("Mobile_No")));
                                                    addressActivityAdapter.notifyDataSetChanged();
                                                }
                                            }
                                        });
                            }
                        }
                    }
                });

        addressActivityAdapter = new AddressAdapter(addressModelList1);
        addressRecyclerView.setAdapter(addressActivityAdapter);
        //address1adapter.notifyDataSetChanged();
    }
}



public class AddressModel {

    private String name;
    private String house;
    private String city;
    private String pincode;
    private String mobile;

    public AddressModel(String name, String house, String city, String pincode, String mobile) {
        this.name = name;
        this.house = house;
        this.city = city;
        this.pincode = pincode;
        this.mobile = mobile;
    }

    public String getName() {
        return name;
    }

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

    public String getHouse() {
        return house;
    }

    public void setHouse(String house) {
        this.house = house;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getPincode() {
        return pincode;
    }

    public void setPincode(String pincode) {
        this.pincode = pincode;
    }

    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }
}


public class AddressAdapter extends RecyclerView.Adapter<AddressAdapter.AddressViewHolder> {

    private List<AddressModel> addressModelList;

    public AddressAdapter(List<AddressModel> addressModelList) {
        this.addressModelList = addressModelList;
    }

    @NonNull
    @Override
    public AddressViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.address_item_layout, viewGroup, false);
        return new AddressViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull AddressViewHolder viewHolder, int position) {

        String b_name = addressModelList.get(position).getName();
        String b_house = addressModelList.get(position).getHouse();
        String b_city = addressModelList.get(position).getCity();
        String b_pincode = addressModelList.get(position).getPincode();
        String b_mobile = addressModelList.get(position).getMobile();

        viewHolder.setData(b_name,b_house,b_city,b_pincode, b_mobile);
    }

    @Override
    public int getItemCount() {
        return addressModelList.size();
    }

    class AddressViewHolder extends RecyclerView.ViewHolder {

        private TextView aname;
        private TextView ahouse;
        private TextView acity;
        private TextView apincode;
        private TextView amobile;

        public AddressViewHolder(@NonNull View itemView) {
            super(itemView);

            aname = itemView.findViewById(R.id.view_full_name);
            ahouse = itemView.findViewById(R.id.view_house_no);
            acity = itemView.findViewById(R.id.view_city);
            apincode = itemView.findViewById(R.id.view_pincode);
            amobile = itemView.findViewById(R.id.view_mobile_no);
        }

        private void setData(String nameText, String houseText, String cityText, String pinText, String mobileText) {
            aname.setText(nameText);
            ahouse.setText(houseText);
            acity.setText(cityText);
            apincode.setText(pinText);
            amobile.setText(mobileText);
        }
    }

}

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Предполагая, что вы хотите отсортировать адреса по имени, в ваш onComplete обратный вызов добавьте вызов для сортировки списка:

addressModelList1.add(new AddressModel( ... ));

// Sort list by name:
Collections.sort(addressModelList1, (address1, address2) -> address1.getName().compareTo(address2.getName());

addressActivityAdapter.notifyDataSetChanged();
0 голосов
/ 24 октября 2019

Я воспроизвел ваш сценарий:

class AddressModel:

private String name;
private String house;
private String city;
private String pincode;
private String mobile;

public AddressModel(String name, String house, String city, String pincode, String mobile) {
    this.name = name;
    this.house = house;
    this.city = city;
    this.pincode = pincode;
    this.mobile = mobile;
}

@Override
public String toString() {
    return "AddressModel{" + "name=" + name + ", house=" + house + ", city=" + city + ", pincode=" + pincode + ", mobile=" + mobile + '}';
}

public String getName() {
    return name;
}

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

public String getHouse() {
    return house;
}

public void setHouse(String house) {
    this.house = house;
}

public String getCity() {
    return city;
}

public void setCity(String city) {
    this.city = city;
}

public String getPincode() {
    return pincode;
}

public void setPincode(String pincode) {
    this.pincode = pincode;
}

public String getMobile() {
    return mobile;
}

public void setMobile(String mobile) {
    this.mobile = mobile;
}

Main:

public static void main(String[] args) {
   AddressModel a1 = new AddressModel("name2", "house2", "city2", "pincod2", "mobile2");
   AddressModel a2 = new AddressModel("name1", "house1", "city1", "pincod1", "mobile1");
   AddressModel a3 = new AddressModel("name4", "house4", "city4", "pincod4", "mobile4");
   AddressModel a4 = new AddressModel("name3", "house3", "city3", "pincod3", "mobile3");
   AddressModel a5 = new AddressModel("name0", "house0", "city0", "pincod0", "mobile0");

   ArrayList list = new ArrayList<AddressModel>();

   list.add(a1);
   list.add(a2);
   list.add(a3);
   list.add(a4);
   list.add(a5);

   System.out.println("Unsorted list:");
   Display(list);


   System.out.println("Sorted by name:");
   //Sort by name
   Comparator<AddressModel> compareByName = (AddressModel am1, AddressModel am2) ->
                                am1.getName().compareTo( am2.getName());

   Collections.sort(list, compareByName);
   Display(list);

}

/**
 * Print a list
 * @param list 
 */
static void Display(ArrayList list){
    for(int i=0; i<list.size(); i++){
       System.out.println(list.get(i).toString());
   }
}

Вы можете изменить Comparator compareByName, если вы не хотите сортироватьваши объекты по имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...