Как сохранить RecyclerView в памяти - PullRequest
0 голосов
/ 26 апреля 2020

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...