Что пропустить, с подключением Firestore и ListView для случайных результатов в выборке? - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь подключить мой Firestore к ListView. С моим Query ставится 20 записей и 3 случайных из них, вставляется ArrayList (randomPlaceList), затем я логично пытаюсь включить это ArrayList в свой пользовательский adapter. Но я что-то скучаю ..

отредактировано с некоторыми переменными изменения; Теперь у меня есть эта ошибка:

Процесс: com.example.arara.myapplication, PID: 10283 java.lang.IndexOutOfBoundsException: индекс: 4, размер: 0 на java.util.ArrayList.get (ArrayList.java:437) на com.example.arara.myapplication.MainActivity $ 1.onComplete (MainActivity.java:46)

В этой строке:

Peoples item = randomPlaceList.get(randomIndex);

Класс ListViewPlaces:

public class MainActivity extends AppCompatActivity {

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference placeRef = rootRef.collection("peoples");

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

    placeRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                List<Peoples> peoplesList = new ArrayList<>();
                for (DocumentSnapshot document : task.getResult()) {
                    Peoples peoples = document.toObject(Peoples.class);
                    System.out.println(peoples);
                    peoplesList.add(peoples);
                }
                if (peoplesList.size() > 0) {
                    System.out.println(peoplesList);
                    int placeCount = peoplesList.size();
                    Random randomGenerator = new Random();
                    List<Peoples> randomPlaceList = new ArrayList<>();
                    for (int i = 0; i < 3; i++) {
                        int randomIndex = randomGenerator.nextInt(placeCount);;
                        Peoples item = randomPlaceList.get(randomIndex);
                        randomPlaceList.add(item);
                    }
                    ListView mListView = findViewById(R.id.place_list);
                    PeoplesAdapter peoplesAdapter = new PeoplesAdapter(getBaseContext(), randomPlaceList);
                    mListView.setAdapter(peoplesAdapter);
                }
            }
        }
    });
}

}

Класс адаптера:

public class PeoplesAdapter extends ArrayAdapter<Peoples> {
public PeoplesAdapter(Context context, List<Peoples> list) {
    super(context, 0, list);
}

@NonNull
@Override
public View getView(int position, View listItemView, @NonNull ViewGroup parent) {
    if (listItemView == null) {
        listItemView = LayoutInflater.from(getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
    }
    Peoples peoples = getItem(position);
    Log.d("TAG", peoples.getName());
    String name = peoples.getName();
    ((TextView) listItemView).setText(name);

    return listItemView;
}
}

А Модель класса:

class Peoples {
private String name, age;

public Peoples() {}

public Peoples(String name, String age) {
    this.name = name;
    this.age = age;
}

public String getName() {
    return name;
}

public String getAge() {
    return age;
}
}

База данных Firestore:

enter image description here

1 Ответ

0 голосов
/ 08 мая 2018

Это способ отображения данных из базы данных Cloud Firestore в ListView с помощью пользовательского ArrayAdapter с Android.

Прежде всего, чтобы добавить данные в базу данных, вы должны использовать следующие строки кода:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference placesRef = rootRef.collection("places");
Places places = new Places("PlaceOne", "ImageOne");
placesRef.document().set(places);

Таким образом, вы можете добавить столько мест, сколько хотите. Итак, у вас будет структура базы данных, которая будет выглядеть следующим образом:

Firestore-root
   |
   --- places (collection)
         |
         --- placeIdOne (document)
         |      |
         |      --- image: "ImageOne"
         |      |
         |      --- name: "NameOne"
         |
         --- placeIdTwo (document)
         |      |
         |      --- image: "ImageTwo"
         |      |
         |      --- name: "NameTwo"
         |
         --- //And so on

Чтобы быть более ясным, см. Изображение ниже:

enter image description here

Если вы хотите запросить данные, вам нужно использовать Query объект.

Query query = placesRef.whereEqualTo("name", "NameOne");

Но поскольку в базе данных у меня всего несколько записей, я буду использовать только placesRef CollectionReference.

Предполагая, что у вас уже есть ListView в вашем файле .XML, который выглядит следующим образом:

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/place_list"/>

Для отображения данных сначала необходимо создать класс адаптера. Этот класс должен выглядеть так:

public class PlacesAdapter extends ArrayAdapter<Places> {
    public PlacesAdapter(Context context, List<Places> list) {
        super(context, 0, list);
    }

    @NonNull
    @Override
    public View getView(int position, View listItemView, @NonNull ViewGroup parent) {
        if (listItemView == null) {
            listItemView = LayoutInflater.from(getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
        }

        Places places = getItem(position);

        String name = places.getName();
        ((TextView) listItemView).setText(name);

        return listItemView;
    }
}

Тогда в вашем методе onCreate() используйте следующий код:

placesRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            List<Places> placesList = new ArrayList<>();
            for (DocumentSnapshot document : task.getResult()) {
                Places places = document.toObject(Places.class);
                placesList.add(places);
            }

            int placeCount = placesList.size();
            Random randomGenerator = new Random();
            List<Places> randomPlaceList = new ArrayList<>();
            for (int i = 1; i <= 3; i++) {
                randomPlaceList.add(placesList.get(randomGenerator.nextInt(placeCount)));
            }
            ListView mListView = (ListView) findViewById(R.id.place_list);
            PlacesAdapter placesAdapter = new PlacesAdapter(getApplicationContext(), randomPlaceList);
            mListView.setAdapter(placesAdapter);
        }
    }
});

Результат в вашем ListView будет 3 случайных места при каждом запуске приложения.

enter image description here

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