我正在从firebase中获取数据。例如,我正在开放部分,随着数据库中的时钟的更新。但是,当我进入应用程序时,该数据将更新。我希望在不离开应用程序的情况下更新此数据。例如,我希望time_textview
中的数据连续更新。因此,我想用timer
每秒从火库中获取数据。我想要time_textview
中的数据更新。我该怎么做?
主类
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, OnItemSelectedListener, View.OnTouchListener, RadioGroup.OnCheckedChangeListener{
ProductsAdapter adapter;
List<Product> productList;
dbProducts.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
productList = new ArrayList<>();
if (dataSnapshot.exists()) {
for (DataSnapshot productSnapshot : dataSnapshot.getChildren()) {
Product p = productSnapshot.getValue(Product.class);
productList.add(p);
}
adapter = new ProductsAdapter(MainActivity.this, productList);
recyclerView.setAdapter(adapter);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
主要适配器:
public class ProductsAdapter extends RecyclerView.Adapter<ProductsAdapter.ProductViewHolder> {
List<Product> productList;
public void onBindViewHolder(final ProductViewHolder holder, final int position) {
Product product = productList.get(position);
holder.textViewTime.setText(product.gettime());
}
class ProductViewHolder extends RecyclerView.ViewHolder {
TextView textViewTime, textTitle, textviewPlaces;
textViewTime = itemView.findViewById(R.id.time_textView);
}
}
使用 ValueEventListener
而不是使用 SingleValueEventListener
喜欢
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, OnItemSelectedListener, View.OnTouchListener, RadioGroup.OnCheckedChangeListener{
ProductsAdapter adapter;
List<Product> productList = new ArrayList<>();
adapter = new ProductsAdapter(MainActivity.this, productList);
recyclerView.setAdapter(adapter);
dbProducts.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
productList.clear();
if (dataSnapshot.exists()) {
for (DataSnapshot productSnapshot : dataSnapshot.getChildren()) {
Product p = productSnapshot.getValue(Product.class);
productList.add(p);
}
// here I will recommend just to notify adapter, and initialize it once outside the listener
adapter.notifyDataSetChanged();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
现在,每次在DB中更改数据时,侦听器都会自动被调用,您将获得最新数据。然后,您可以清除旧列表,在其中插入新数据,然后致电adapter.notifyDataSetChanged()