簡體   English   中英

如何使用 firebase 獲取 listView 中每個項目的數據?

[英]How can I get the data for each item in the listView using firebase?

我制作了一個從 Firebase 獲取數據的應用程序,當我點擊listView它會向我顯示每個項目的數據,但問題是當我點擊listView一個項目時, displayInformation文件打開但顯示上次上傳到 firebase 的數據,不顯示ListView每個項目的數據。

這是 Firebase 數據:

{
  "List" : {
    "-Mmi2obH5ji14w82qUhR" : {
      "age" : 22,
      "description" : "blah",
      "firstName" : "John",
      "lastName" : "Michael"
    },
    "-MmiDkIXb_vLqET8BmKX" : {
      "age" : 24,
      "description" : "blah",
      "firstName" : "Leonardo",
      "lastName" : ""
    },
    "-MmnL1PYbcyW9VJPytr3" : {
      "age" : 19,
      "description" : "blah",
      "firstName" : "Mohamed",
      "lastName" : ""
    }
  }
}

這些是我的代碼:

這是MainActivity代碼:

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {

    private static final int LIST_APP_LOADER = 0;

    ArrayList<Informatin> listItem;
    ListView listView;
    listAppAdapter adapter;

    DatabaseReference reference;

    private String firstName;
    private String lastName;
    private String age;
    private String description;

    ArrayList<Informatin> mInformation;

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

        listItem = new ArrayList<>();
        listView = findViewById(R.id.list);

        listView.setTextFilterEnabled(true);

        listView.setOnItemClickListener((parent, view, position, id) -> {
            Intent intent = new Intent(MainActivity.this, DisplayInformations.class);
            intent.putExtra("firstName", firstName);
            intent.putExtra("lastName", lastName);
            intent.putExtra("age", age);
            intent.putExtra("description", description);

            startActivity(intent);
        });

        LoaderManager.getInstance(this).initLoader(LIST_APP_LOADER, null, this);

        mInformation = new ArrayList<>();

        adapter = new listAppAdapter(this, mInformation);
        listView.setAdapter(adapter);

        reference = FirebaseDatabase.getInstance().getReference("List");
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                mInformation.clear();
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    firstName = snapshot.child("firstName").getValue().toString();
                    lastName = snapshot.child("lastName").getValue().toString();
                    age = snapshot.child("age").getValue().toString();
                    description = snapshot.child("description").getValue().toString();

                    Informatin informatin = new Informatin(firstName, lastName, description, age);
                    mInformation.add(informatin);

                }
                adapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.menu_main_screen, menu);

        return true;
    }

    @NonNull
    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        return null;
    }

    @Override
    public void onLoadFinished(@NonNull Loader<Cursor> loader, Cursor data) {
        adapter.notifyDataSetChanged();
    }

    @Override
    public void onLoaderReset(@NonNull Loader<Cursor> loader) {
        return null;
    }
}
this codes for `displayInformation` :

公共類 DisplayInformations 擴展 AppCompatActivity 實現 LoaderManager.LoaderCallbacks {

private Uri mCurrentPersonUri;

private TextView mNameDisplay;
private TextView mAgeDisplay;
private TextView mDescriptionDisplay;
private ImageView mImageTopBar;
private Toolbar mToolbar;

private String firstName;
private String lastName;
private String age;
private String description;

private static final int EXISTING_LIST_APP_LOADER = 0;

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

    Intent intent = getIntent();
    firstName = intent.getStringExtra("firstName");
    lastName = intent.getStringExtra("lastName");
    age = intent.getStringExtra("age");
    description = intent.getStringExtra("description");
    mCurrentPersonUri = intent.getData();

    loadListDetails();

    mNameDisplay = findViewById(R.id.name_display);
    mAgeDisplay = findViewById(R.id.age_display);
    mDescriptionDisplay = findViewById(R.id.description_display);
    mImageTopBar = findViewById(R.id.image_top_bar);

    mToolbar = findViewById(R.id.main_toolbar);
    LoaderManager.getInstance(this).initLoader(EXISTING_LIST_APP_LOADER, null, this);
}

private void loadListDetails() {
            String name = firstName + " " + lastName;

            int ageInt = Integer.parseInt(age);
            setTitle(name);
            mNameDisplay.setText(name);
            if (age.equals("1")) {
                String ageDisplay = getString(R.string.age) + ": " + getString(R.string.one_year);
                mAgeDisplay.setText(ageDisplay);
            } else if (age.equals("2")) {
                String ageDisplay = getString(R.string.age) + ": " + getString(R.string.two_year);
                mAgeDisplay.setText(ageDisplay);
            } else if (ageInt >= 3 && ageInt <= 10) {
                String ageDisplay = getString(R.string.age) + ": " + age + getString(R.string.years);
                mAgeDisplay.setText(ageDisplay);
            } else if (ageInt >= 11) {
                String ageDisplay = getString(R.string.age) + ": " + age + getString(R.string.year);
                mAgeDisplay.setText(ageDisplay);
            }
            mDescriptionDisplay.setText(description);
        }

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    getMenuInflater().inflate(R.menu.menu_display_informations, menu);
    return true;
}

@NonNull
@Override
public Loader<Cursor> onCreateLoader(int id, @Nullable Bundle args) {
    return null;
}

@Override
public void onLoadFinished(@NonNull Loader<Cursor> loader, Cursor cursor) {
    if (cursor == null || cursor.getCount() < 1) {
        return;
    }
    if (cursor.moveToFirst()) {

        loadListDetails();

        setSupportActionBar(mToolbar);

    }
}

@Override
public void onLoaderReset(@NonNull Loader<Cursor> loader) {
    mNameDisplay.setText("");
    mAgeDisplay.setText("");
    mDescriptionDisplay.setText("");
}

}

數據從 Firebase 異步加載。 這意味着它需要一些時間才能在您的應用程序中可用。 將這些變量設置為全局變量並不能解決問題。 您需要做的是從適配器獲取數據作為Informatin類型的對象,然后將其添加到您的 Intent 對象中。 假設您已經為每個字段設置了 getter,請使用以下代碼行:

listView.setOnItemClickListener((parent, view, position, id) -> {
    Informatin informatin = (Informatin) parent.getAdapter().getItem(position);
    Intent intent = new Intent(MainActivity.this, DisplayInformations.class);
    intent.putExtra("firstName", informatin.getFirstName());
    intent.putExtra("lastName", informatin.getLastName());
    intent.putExtra("age", informatin.getAge());
    intent.putExtra("description", informatin.getDescription());
    startActivity(intent);
});

或者您可以將整個Informatin對象添加到 Intent,而不是單獨添加每個字段。 要取回它,只需使用Intent#getSerializableExtra()方法。

另請注意,數據庫中的age字段是數字而不是字符串。 所以請更改:

private String age;

進入:

private long age;

和:

age = snapshot.child("age").getValue().toString();

進入:

age = snapshot.child("age").getValue(Long.class);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM