Android Firestore中添加到微调器的自定义对象的ArrayList

Android Firestore中添加到微调器的自定义对象的ArrayList,android,object,arraylist,google-cloud-firestore,Android,Object,Arraylist,Google Cloud Firestore,所有这些都是新的…我创建了以下代码: 自定义类对象 public class Category { private String documentID; private int id; private String description; private boolean active; private int sort; public Category(){ //public no-arg constructor needed } public Category(int id, S

所有这些都是新的…我创建了以下代码:

自定义类对象

public class Category {
private String documentID;
private int id;
private String description;
private boolean active;
private int sort;

public Category(){
    //public no-arg constructor needed
}

public Category(int id, String description, boolean active, int sort) {
    this.id = id;
    this.description = description;
    this.active = active;
    this.sort = sort;
}

@Exclude
public String getDocumentID() {
    return documentID;
}

public void setDocumentID(String documentID) {
    this.documentID = documentID;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getDescription() {
    return description;
}

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

public boolean isActive() {
    return active;
}

public void setActive(boolean active) {
    this.active = active;
}

public int getSort() {
    return sort;
}

public void setSort(int sort) {
    this.sort = sort;
}

@Override
public String toString() {
    return description;
}
}

主要活动类

public class MainActivity extends AppCompatActivity {

// Local XML obect declarations...
private Spinner spinner_Category;

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

    // Load the CATEGORY spinner with the ACTIVE categories from the Firestore
    spinner_Category = (Spinner)findViewById(R.id.spinner_category);
    populateCategories();

    spinner_Category.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            Category category = (Category) parent.getSelectedItem();
            displayCategoryData(category);
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
            String message = "Nothing selected";
            Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();

        }
    });
}

private void populateCategories(){
    // DBHelper dbHelper = DBHelper.getInstance(this);
    DBHelper dbHelper = new DBHelper(this);

    ArrayList<Category> categoryList = dbHelper.getAllCategories();

    ArrayAdapter<Category> adapterCategories  = new ArrayAdapter<Category>(this,
            android.R.layout.simple_spinner_item, categoryList);
    adapterCategories.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner_Category.setAdapter(adapterCategories);

}

private void displayCategoryData(Category category) {
    String description = category.getDescription();
    int sort = category.getSort();
    boolean active = category.isActive();

    String userData = "Description: " + description + "\nSort: " + sort + "\nActive: " + active;

    Toast.makeText(this, userData, Toast.LENGTH_LONG).show();
}
public类MainActivity扩展了AppCompatActivity{
//本地XML对象声明。。。
私有微调器微调器_类;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//使用Firestore中的活动类别加载类别微调器
微调器_类别=(微调器)findViewById(R.id.spinner_类别);
populateCategories();
微调器_Category.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、视图视图、整型位置、长id){
Category Category=(Category)parent.getSelectedItem();
显示类别数据(类别);
}
@凌驾
未选择公共无效(AdapterView父级){
字符串消息=“未选择任何内容”;
Toast.makeText(MainActivity.this,message,Toast.LENGTH_LONG.show();
}
});
}
私有void populateCategories(){
//DBHelper DBHelper=DBHelper.getInstance(this);
DBHelper DBHelper=新的DBHelper(this);
ArrayList categoryList=dbHelper.getAllCategories();
ArrayAdapter适配器类别=新的ArrayAdapter(此,
android.R.layout.simple\u微调器\u项,类别列表);
adapterCategories.setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
微调器类别设置适配器(适配器类别);
}
私有void displayCategoryData(类别){
字符串描述=category.getDescription();
int sort=category.getSort();
boolean active=category.isActive();
String userData=“Description:”+Description+“\nSort:”+sort+“\n活动:”+active;
Toast.makeText(this,userData,Toast.LENGTH_LONG).show();
}
}

我的DBHelper类(要读/写Firestore数据库的通用类对象)中的方法

/*函数:getAllCategories
*从Firestore返回活动cattegories的集合*/
公共阵列列表getAllCategories(){
最终ArrayList类别列表=新ArrayList();
CollectionReference colref=db.collection(集合类别);
colref.WHEREQUALTO(活动类别,真实)
.get()
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(QuerySnapshot QueryDocumentSnapshot){
用于(QueryDocumentSnapshot dcSnapshot:QueryDocumentSnapshot){
c类=dcSnapshot.toObject(Category.class);
c、 setDocumentID(dcSnapshot.getId());
类别列表。添加(c);
}
}
})
.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Log.d(标记,例如toString());
}
});
返回类别列表;
}
最后是活动的主XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<TextView
    android:id="@+id/text_view_title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:layout_marginBottom="10sp"
    android:text="App Title"
    android:textColor="@color/cardview_dark_background"
    android:textSize="18sp" />

<Spinner
    android:id="@+id/spinner_category"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="16dp"
    android:padding="16dp" />

问题是,此代码可能会使用类别对象填充微调器,但它不会显示、最初选择或触发已选择的事件。由于此代码实际上与我从SQLite数据库而不是Firestore数据库读取记录时使用的其他代码相同,因此我假设是QueryDocumentSnapshot.toObject()方法以某种方式更改了集合


任何建议都将不胜感激……

填充列表并将列表添加到适配器后,运行以下命令:


adapterCategories.notifyDataSetChanged()

不使用适配器的默认布局资源,而是创建一个自定义布局资源并使用它。因此,在布局文件夹中,创建如下布局:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textColor="@color/black"
android:textSize="15sp"
android:textStyle="bold"
/>

并将其命名为spinner_textbox.xml。然后在您的活动中,而不是:

 ArrayAdapter<Category> adapterCategories  = new ArrayAdapter<Category>(this,
        android.R.layout.simple_spinner_item, categoryList);
adapterCategories.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
ArrayAdapter适配器类别=新的ArrayAdapter(此,
android.R.layout.simple\u微调器\u项,类别列表);
adapterCategories.setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
这样做:

 ArrayAdapter<Category> adapterCategories  = new ArrayAdapter<Category>(this,
        R.layout.spinner_textbox, categoryList);
adapterCategories.setDropDownViewResource(R.layout.spinner_textbox);
ArrayAdapter适配器类别=新的ArrayAdapter(此,
R.layout.spinner_文本框,类别列表);
adapterCategories.setDropDownViewResource(R.layout.spinner_文本框);

请记住删除“android”,以便它从R中找到您的自定义布局。

我是否遗漏了什么?微调器没有此方法/属性。在适配器中调用notifyDataSetChanged没有任何区别。
 ArrayAdapter<Category> adapterCategories  = new ArrayAdapter<Category>(this,
        R.layout.spinner_textbox, categoryList);
adapterCategories.setDropDownViewResource(R.layout.spinner_textbox);