java - 为什么实时数据库无法在我的 recyclerview 中工作

标签 java android android-recyclerview firebase-realtime-database real-time-data

我尝试更改控制台 Firebase 中的数据库,但适配器中的数据未更改,recyclerview 仅在应用程序关闭并再次打开时更改

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private List<ModelDB> dbList = new ArrayList<>();
    private AdapterDB adapter;
    private RecyclerView recyclerView;
    FirebaseDatabase database;
    DatabaseReference reference;



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

        initFirebase();
        getData();
        initRecylerView();

    }

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.add_person:
                Intent intent = new Intent(getApplicationContext(),RegisterActivity.class);
                startActivity(intent);
                break;
            default:
                Toast.makeText(getApplicationContext(),"lalalala",Toast.LENGTH_LONG).show();
                break;
        }

        return super.onOptionsItemSelected(item);
    }

    private void initFirebase(){
        database = FirebaseDatabase.getInstance();
        reference = database.getReference("user");

    }


    private void initRecylerView(){
        recyclerView = (RecyclerView)findViewById(R.id.rv_list);
        recyclerView.setHasFixedSize(true);
        adapter = new AdapterDB(dbList);
        recyclerView.setAdapter(adapter);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
        recyclerView.setLayoutManager(layoutManager);
    }


    private void getData() {
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                //loop data all user
                for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {

                    //instance object to get and set data
                    ModelDB modelDB = postSnapshot.getValue(ModelDB.class);

                    //adding data list from object
                    dbList.add(modelDB);

                }

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

}

AdapterDB.java

public class AdapterDB extends RecyclerView.Adapter<AdapterDB.MyViewHolder> {

    private List<ModelDB> modelDBList;

    public AdapterDB(List<ModelDB> modelDBList) {
        this.modelDBList = modelDBList;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_data,parent,false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        ModelDB modelDB = modelDBList.get(position);
        holder.tv_nama.setText(modelDB.getNama());
        holder.tv_alamat.setText(modelDB.getAlamat());

    }

    @Override
    public int getItemCount() {
        return modelDBList.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {

        TextView tv_nama, tv_alamat;

        public MyViewHolder(View itemView) {
            super(itemView);

            tv_nama = (TextView) itemView.findViewById(R.id.tv_nama);
            tv_alamat = (TextView) itemView.findViewById(R.id.tv_alamat);
        }
    }
}

最佳答案

您需要让适配器知道数据已更改并且必须刷新 UI 或其他什么。代码中的 OnDataChange 应该是这样的(检查方法中的最后一行) -

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    //loop data all user
    for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {

        //instance object to get and set data
        ModelDB modelDB = postSnapshot.getValue(ModelDB.class);

        //adding data list from object
        dbList.add(modelDB);
        adapter.notifyDataSetChanged();
    }

}

假设代码的其他部分没有其他错误,这应该可以解决问题

关于java - 为什么实时数据库无法在我的 recyclerview 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42184179/

相关文章:

android - 如何使用区域设置和配置在我的语言更改时选择不同的 Assets 文件?

java - 使用 Java NIO 的文件复制在 Linux 上很慢

java - 如何避免静态方法的冗余代码

java - Jasper Report阿拉伯语查询问题

android - Observable android 理解

android - 如何滚动到 recyclerview 内的偏移量?

android - 如何在 StaggeredGridLayoutManager 中实现动态行跨度

java - 递归函数不适用于 CheckLink 函数

java - Android Studio : Images do not show up while debugging app on phone, 但在模拟器上做

android - PostgreSQL 项目的数据库托管选项