Context
Я использую RecyclerView
в Fragment
и FirestoreRecyclerAdapter
в качестве адаптера. У меня есть 3 фрагмента home
, analytics
и settings
.
Проблема
Проблема в том, что когда я go возвращаюсь к своему (домашнему) фрагменту из любых других фрагментов, которые он воссоздает RecyclerView
и каждый элемент списка в нем. Есть ли способ сохранить RecyclerView
в памяти, чтобы он оставался эффективным.
Код
Это мой HomeFragment :
public class HomeFragment extends Fragment {
private String TAG = "HomeFragment";
private FirestoreRecyclerAdapter adapter;
private FirebaseAuth mAuth;
public HomeFragment(){
FirebaseFirestore db_instance = FirebaseFirestore.getInstance();
mAuth = FirebaseAuth.getInstance();
CollectionReference users_collection = db_instance.collection("users");
DocumentReference user_doc = users_collection.document(getUserId());
final CollectionReference user_expenses = user_doc.collection("expenses");
Query query = user_expenses.orderBy("timestamp", Query.Direction.DESCENDING);
FirestoreRecyclerOptions<Expense> options = new FirestoreRecyclerOptions.Builder<Expense>()
.setQuery(query, Expense.class)
.build();
adapter = new FirestoreRecyclerAdapter<Expense, ExpenseViewHolder>(options) {
@NonNull
@Override
public ExpenseViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
Log.d(TAG, "onCreateViewHolder called");
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View view = layoutInflater.inflate(R.layout.individual_expenditure_layout, parent, false);
return new ExpenseViewHolder(view);
}
@Override
protected void onBindViewHolder(@NonNull final ExpenseViewHolder expenseViewHolder, int position, @NonNull final Expense expense) {
Log.d(TAG, "onBindViewHolder position = " + position);
expenseViewHolder.setAmount(expense.getAmount());
expenseViewHolder.setDescription(expense.getDescription());
expenseViewHolder.setTimestamp(expense.getTimestamp());
expenseViewHolder.button_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = expenseViewHolder.getAdapterPosition();
Log.d(TAG, "onBindViewHolder :: onClick :: position = " + position);
getSnapshots().getSnapshot(position).getReference().delete();
}
});
}
};
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_home, container, false);
Log.d(TAG, "creating recyclerView");
final RecyclerView recyclerView = v.findViewById(R.id.expense_list);
Log.d(TAG, "setting adapter");
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
return v;
}
private String getUserId() {
return mAuth.getCurrentUser().getUid();
}
@Override
public void onStart() {
super.onStart();
adapter.startListening();
}
@Override
public void onStop() {
super.onStop();
adapter.stopListening();
}
}
Теперь он воссоздает каждый элемент списка, он отлично работает для небольшого количества элементов, но при загрузке большого количества элементов это станет проблемой. В то время как хранение их всех в памяти не должно быть проблемой.
Logcat
2020-04-26 02:04:53.760 7838-7838/com.example.expenditure D/HomeFragment: creating recyclerView
2020-04-26 02:04:53.760 7838-7838/com.example.expenditure D/HomeFragment: setting adapter
2020-04-26 02:04:54.123 7838-7838/com.example.expenditure D/HomeFragment: onCreateViewHolder called
2020-04-26 02:04:54.149 7838-7838/com.example.expenditure D/HomeFragment: onBindViewHolder position = 0
2020-04-26 02:04:54.159 7838-7838/com.example.expenditure D/HomeFragment: onCreateViewHolder called
2020-04-26 02:04:54.169 7838-7838/com.example.expenditure D/HomeFragment: onBindViewHolder position = 1
2020-04-26 02:04:54.178 7838-7838/com.example.expenditure D/HomeFragment: onCreateViewHolder called
2020-04-26 02:04:54.188 7838-7838/com.example.expenditure D/HomeFragment: onBindViewHolder position = 2
2020-04-26 02:04:54.201 7838-7838/com.example.expenditure D/HomeFragment: onCreateViewHolder called
2020-04-26 02:04:54.207 7838-7838/com.example.expenditure D/HomeFragment: onBindViewHolder position = 3
2020-04-26 02:04:54.214 7838-7838/com.example.expenditure D/HomeFragment: onCreateViewHolder called
2020-04-26 02:04:54.224 7838-7838/com.example.expenditure D/HomeFragment: onBindViewHolder position = 4
2020-04-26 02:04:54.235 7838-7838/com.example.expenditure D/HomeFragment: onCreateViewHolder called
2020-04-26 02:04:54.244 7838-7838/com.example.expenditure D/HomeFragment: onBindViewHolder position = 5
2020-04-26 02:04:59.812 7838-7838/com.example.expenditure D/HomeFragment: creating recyclerView
2020-04-26 02:04:59.812 7838-7838/com.example.expenditure D/HomeFragment: setting adapter
2020-04-26 02:04:59.848 7838-7838/com.example.expenditure D/HomeFragment: onCreateViewHolder called
2020-04-26 02:04:59.857 7838-7838/com.example.expenditure D/HomeFragment: onBindViewHolder position = 0
2020-04-26 02:04:59.867 7838-7838/com.example.expenditure D/HomeFragment: onCreateViewHolder called
2020-04-26 02:04:59.877 7838-7838/com.example.expenditure D/HomeFragment: onBindViewHolder position = 1
2020-04-26 02:04:59.887 7838-7838/com.example.expenditure D/HomeFragment: onCreateViewHolder called
2020-04-26 02:04:59.899 7838-7838/com.example.expenditure D/HomeFragment: onBindViewHolder position = 2
2020-04-26 02:04:59.911 7838-7838/com.example.expenditure D/HomeFragment: onCreateViewHolder called
2020-04-26 02:04:59.923 7838-7838/com.example.expenditure D/HomeFragment: onBindViewHolder position = 3
2020-04-26 02:04:59.930 7838-7838/com.example.expenditure D/HomeFragment: onCreateViewHolder called
2020-04-26 02:04:59.942 7838-7838/com.example.expenditure D/HomeFragment: onBindViewHolder position = 4
2020-04-26 02:04:59.949 7838-7838/com.example.expenditure D/HomeFragment: onCreateViewHolder called
2020-04-26 02:04:59.957 7838-7838/com.example.expenditure D/HomeFragment: onBindViewHolder position = 5