我尝试将Firestore
与ListView
联系起来。使用我的Query
,其中有20条记录和3条随机内容,放入ArrayList
(randomPlaceList
),然后我合理地尝试将此ArrayList
包含到我的自定义{{} 1}}。但我想念一些......
用一些变化变量编辑;现在我有这个错误:
处理:com.example.arara.myapplication,PID:10283 java.lang.IndexOutOfBoundsException:索引:4,大小:0 at java.util.ArrayList.get(ArrayList.java:437) at com.example.arara.myapplication.MainActivity $ 1.onComplete(MainActivity.java:46)
在这一行:
adapter
ListViewPlaces类:
Peoples item = randomPlaceList.get(randomIndex);
适配器类:
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);
}
}
}
});
}
}
和Model类:
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;
}
}
Firestore数据库:
答案 0 :(得分:1)
这是使用Android自定义ListView
将数据从Cloud Firestore数据库显示到ArrayAdapter
的方法。
首先,要将数据添加到数据库,您应该使用以下代码行:
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
要成为更多的作者,请看下面的图片:
如果要查询数据,则需要使用Query
对象。
Query query = placesRef.whereEqualTo("name", "NameOne");
但是因为我在数据库中只有几条记录,所以我只使用placesRef
CollectionReference。
假设您的.XML文件中已有ListView
,如下所示:
<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个随机位置。