0

Я пытался изменить базу данных в консоли firebase, но данные в моем адаптере без изменений, 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

Вы должны рода позволить адаптер знать, что данные изменились, и что пользовательский интерфейс должен быть обновлен или 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 –

Смежные вопросы