1

FirebaseでLiveDataとViewModelを使用しています。私は以下のコードを使ってRecyclerViewのデータを表示しています。ViewModelが毎回呼び出される

public class CategoryActivity extends AppCompatActivity { 

@BindView(R.id.toolbar_category) 
Toolbar toolbar; 
@BindView(R.id.recycler_view_category) 
RecyclerView categoryRecyclerView; 
private List<Category> categoryList = new ArrayList<>(); 
private CategoryAdapter mAdapter; 
private Context context; 

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_category); 
    ButterKnife.bind(this); 
    setSupportActionBar(toolbar); 
    context = this; 

    mAdapter = new CategoryAdapter(categoryList, context); 
    RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(this, 2); 
    categoryRecyclerView.setLayoutManager(mLayoutManager); 
    categoryRecyclerView.setItemAnimator(new DefaultItemAnimator()); 
    categoryRecyclerView.setAdapter(mAdapter);  
    CategoryViewModel categoryViewModel = ViewModelProviders.of(this).get(CategoryViewModel.class); 
    LiveData<DataSnapshot> liveData = categoryViewModel.getDataSnapshotLiveData(); 
    liveData.observe(this, new Observer<DataSnapshot>() { 
     @Override 
     public void onChanged(@Nullable DataSnapshot dataSnapshot) { 

      Log.e("CategoryActivity","inside"); 
      Iterable<DataSnapshot> dataSnapshotIterable = dataSnapshot.getChildren(); 
      for (DataSnapshot p : dataSnapshotIterable) { 
       Category categoryFromFirebase = p.getValue(Category.class); 
       categoryList.add(categoryFromFirebase); 
      } 
       mAdapter.notifyDataSetChanged(); 
     } 
    }); 
} 
} 

私の問題は、私は携帯電話をロックしてロックを解除しても、すべてが再び呼び出されると、データがRecyclerViewで重複してしまうことです。私は何が問題なのか理解できません。助けてください。

+0

リストをクリアする必要があります –

+0

いつも呼び出されている理由を知りたいのですが? @ ShivamOberoi –

+0

あなたはOnCreateでその呼び出しを呼び出しています。そのアクティビティに来るたびに呼び出されます。 –

答えて

0

arraylistを削除してから、それを追加する前にcategoryList.clear();まず、シナリオ理解

liveData.observe(this, new Observer<DataSnapshot>() { 
     @Override 
     public void onChanged(@Nullable DataSnapshot dataSnapshot) { 

     categoryList.clear(); //clear your arraylist values before adding 

      Log.e("CategoryActivity","inside"); 
      Iterable<DataSnapshot> dataSnapshotIterable = dataSnapshot.getChildren(); 
      for (DataSnapshot p : dataSnapshotIterable) { 

       Category categoryFromFirebase = p.getValue(Category.class); 

       categoryList.add(categoryFromFirebase); 

      } 

       mAdapter.notifyDataSetChanged(); 
     } 
    }); 
+0

アクティビティが破棄されていない場合でも、なぜ呼び出されるのか分かりますか? –

+0

@MehulKanzariyaもう一度仲間を確認してください。活動が壊れたら、それを勝ち取ってください...あなたは他の場所に電話してください... –

1

デバイスをロック: onDestroy()、のonCreate()、ONSTART()、onResume()メソッドと呼ばれます

デバイスのロックを解除: onResume()メソッドが呼び出す

あなたのロジックはonCreate()メソッドに存在するので、すべてが何度も何度も呼び出されます。

この問題を解決するには、 'categoryList'を消去するか、同じ場所でもう一度初期化して、新しいインスタンスを作成する必要があります。

関連する問題