0

我試圖改變在控制檯火力數據庫,但在我的適配器不變的數據,當應用程序被關閉recylerview只改變並再次打開爲什麼實時數據庫不能在我的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); 
     } 
    } 
} 
+1

你嘗試'插入新項目後''adapter.notifyDataSetChanged();'? – ZeroOne

回答

2

你需要那種讓適配器知道數據已經改變,而且UI具有被刷新或whatev呃。該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(); 
    } 

} 

這應該做的伎倆假設沒有其他錯誤代碼中的其他一些地方

+0

當我添加功能adapter.notifyDataSetChanged(); recyclerview將更新數據,但數據變成舊數據+新數據 –

+0

這就是我在我的答案中的意思,當我說你的代碼中沒有其他錯誤:)。順便說一下,我認爲'dbList'應該是一個集合而不是一個列表,這就是爲什麼你在視圖中看到重複的對象。但這是一個猜測,因爲我沒有真正執行你的代碼。 – Dibzmania

+0

謝謝先生我在數據發生變化時通過添加dbList.clear解決了問題:D –

相關問題