将 Firebase 数据库中的值加载到 Android 中的下拉文本视图中

Loading values from Firebase database into drop down Textviews in Android

我需要帮助将辅助 Firebase 数据库中的数据实现到我的 android 应用程序中的自动完成 TextView。我有一个包含汽车数据(汽车品牌、汽车型号、发动机尺寸)的数据库。

我附上了一张图片,显示了我的数据是如何在数据库中设置的。

数据库图片

我想要一个仅显示所有 "make" 属性的 TextView,另一个仅显示 "model" 属性的 TextView,具体取决于用户选择的 "make of car" 属性。 (例如,如果用户选择奥迪,则显示的车型将仅为 A4、A6、A3。如果用户选择大众,则显示的车型将仅为高尔夫、捷达、帕萨特)然后最终的 TextView 仅显示 "engine size" 对应于所选的 "make" 和 "model",因为每种型号的汽车都有不同的发动机尺寸。

任何帮助将不胜感激,因为我已经在我的应用程序的这个元素上停留了几个星期,并尝试了无数不同的方法。

下面是我的 class 和代码。该应用程序运行时没有错误,但不会从数据库中检索数据。

public class VehicleSpec extends AppCompatActivity
{
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    //Sets the layout according to the XML file
    setContentView(R.layout.activity_vehicle_spec);

    //FirebaseDatabase database = FirebaseDatabase.getInstance();

    //
    FirebaseOptions options = new FirebaseOptions.Builder()
            .setApplicationId("com.example.user.vel")
            .setApiKey("AIzaSyBvBtL81H7aiUK90c3QfVccoU1CowKrmAA")
            .setDatabaseUrl("https://finalyearproject-vel1-aac42.firebaseio.com/")
            .build();

    //
    FirebaseApp.initializeApp(this, options, "secondary");

    //
    FirebaseApp app = FirebaseApp.getInstance("secondary");
    FirebaseDatabase database2 = FirebaseDatabase.getInstance(app);
    DatabaseReference dbref = database2.getReference();
    DatabaseReference dbref2 = database2.getReference();
    DatabaseReference dbref3 = database2.getReference();

    //
    dbref.child("Cars").addValueEventListener(new ValueEventListener()
    {
        public void onDataChange(DataSnapshot dataSnapshot)
        {
            final List<String> Cars = new ArrayList<String>();

            for ( DataSnapshot suggestionSnap : dataSnapshot.getChildren() )
            {
                String suggestion = suggestionSnap.child("Make").getValue(String.class);
                Cars.add(suggestion);

            }//End For()

            //XML TextView variable
            AutoCompleteTextView actv = (AutoCompleteTextView) findViewById(R.id.auto);
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(VehicleSpec.this, android.R.layout.simple_list_item_1, Cars);
            actv.setAdapter(adapter);

        }//End onDataChange()

        public void onCancelled(DatabaseError databaseError)
        {

        }//End onCancelled()

    });//End dbref ValueEventListener()

    //
    dbref2.child("Cars").addValueEventListener(new ValueEventListener()
    {
        public void onDataChange(DataSnapshot dataSnapshot)
        {
            final List<String> Cars = new ArrayList<String>();

            for ( DataSnapshot suggestionSnap : dataSnapshot.getChildren() )
            {
                String suggestion = suggestionSnap.child("Model").getValue(String.class);
                Cars.add(suggestion);
            }//End for()

            //XML TextView variable
            AutoCompleteTextView actv1 = (AutoCompleteTextView) findViewById(R.id.auto1);
            ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(VehicleSpec.this, android.R.layout.simple_list_item_1, Cars);
            actv1.setAdapter(adapter1);

        }//End onDataChange()

        public void onCancelled(DatabaseError databaseError)
        {

        }//End onCancelled()

    });//End dbref2 ValueEventListener()

    //
    dbref3.child("Cars").addValueEventListener(new ValueEventListener()
    {
        public void onDataChange(DataSnapshot dataSnapshot)
        {
            final List<String> Cars = new ArrayList<String>();

            for (DataSnapshot suggestionSnap : dataSnapshot.getChildren())
            {
                String suggestion = suggestionSnap.child("Engine Size").getValue(String.class);
                Cars.add(suggestion);
            }//End for()

            //XML TextView variable
            AutoCompleteTextView actv2 = (AutoCompleteTextView) findViewById(R.id.auto2);
            ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(VehicleSpec.this, android.R.layout.simple_list_item_1, Cars);
            actv2.setAdapter(adapter2);

        }//End onDataChange()

        public void onCancelled(DatabaseError databaseError)
        {

        }//End onCancelled()

    });//End dbref3 ValueEventListener()

}//End onCreate()

我不太明白你到底想达到什么目的,但我们假设你想要以下之一:

  • 显示列表 中的汽车,列表包含 3 个部分、制造商、型号和发动机尺寸的下拉列表: 我建议使用 RecyclerView 和 2 TextViews(1 个用于 Make,第二个用于模型)和一个 AppCompatSpinner 将从引擎大小节点填充。您可以将这些库用作适配器:
  • FirebaseUI
  • Infinite-Fire 我个人喜欢这个,因为当你到达最后一个项目时它有一个内置的 loadMore。

  • 显示汽车品牌列表(在本例中为制造商),当用户选择一个项目时,会出现另一个包含型号和引擎尺寸的列表:我建议使用 RecyclerView 和 A TextViews 作为 Make,当用户单击一个项目时,您将项目名称保存在 SharedPrefrances 中并打开一个仅显示模型的新 activity从选定的 Make 使用 Firebase databaseRef.child("Cars").orderByChild("Make").equalesTo(getSelectedMake()); 或者只是使用相同的方法将它们显示在 AlertDialog 中而不是服装布局...用于显示 DATA 您也可以使用上述库。

如果这不是您要查找的内容,请详细说明您的问题,我会更新我的答案。

Edit : 使用 SharedPreferences 保存项目的引用是胡说八道,这是我对 [=58 的经验不足的结果=],你可以使用 intent.putExtra()

示例

//Start your activity like this
intent.putExtra("itemId", itemId)
startService(intent)

//On your new activity's onCreate() get the itemId as the following
String itemId = intent.getStringExtra("itemId")
Item item = firebaseRef.child("cars")....getValue(Item:class)