Enaam Riyadh
Enaam Riyadh

Reputation: 141

Don't refresh RecyclerView when returning to Activity

I have implemented one app where I am using RecyclerView when i click on item it go to another activity to show details of that item when i click back the recyclerView reload i wan to make the back button back to the same position in recylerView please help I search a lot but i did not find any thing my code is:

public class Optimism extends AppCompatActivity {
    RecyclerView recyclerView;
    FirebaseDatabase mFirebaseDatabase;
    DatabaseReference mdatabaseReference;
    LinearLayoutManager linearLayoutManager;
    Parcelable mListState;
    ArrayList<items>ar;

    ImageView saveImage;

    public static Optimism getOpt() {
        return opt;
    }

    static Optimism opt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_optimism);

        opt = this;
        final ProgressBar progressBar = findViewById(R.id.progressBar);
        Drawable d = getResources().getDrawable(R.drawable.progress);
        progressBar.setProgressDrawable(d);
        //back botton
        if (getSupportActionBar() != null) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setDisplayShowHomeEnabled(true);
        }
        //reycyclerView
        recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, true);
        linearLayoutManager.setStackFromEnd(true);
        recyclerView.setLayoutManager(linearLayoutManager);

        //get type
        String type = getIntent().getStringExtra("Type");
        //ActionBar
        ActionBar actionBar = getSupportActionBar();
        actionBar.setTitle(type);
        actionBar.setDisplayShowHomeEnabled(true);
        actionBar.setDisplayHomeAsUpEnabled(true);


        //firebase
        mFirebaseDatabase = FirebaseDatabase.getInstance();
        mdatabaseReference = mFirebaseDatabase.getReference(type);
        mdatabaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    progressBar.setVisibility(View.GONE);
                }

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Toast.makeText(Optimism.this, databaseError.getMessage(), Toast.LENGTH_LONG).show();

            }
        });
        mdatabaseReference.keepSynced(true);


    }

    @Override
    protected void onStart() {
        super.onStart();
        final FirebaseRecyclerAdapter<items, RecycleViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<items, RecycleViewHolder>(
                items.class,
                R.layout.card_view_design,
                RecycleViewHolder.class
                , mdatabaseReference) {
            @Override
            protected void populateViewHolder(RecycleViewHolder viewHolder, items model, int position) {

                viewHolder.setDetails(getApplicationContext(), model.getImage(), model.getTitle());

            }

            @Override
            public RecycleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                final RecycleViewHolder recycleViewHolder = super.onCreateViewHolder(parent, viewType);

                recycleViewHolder.setOnClickListener(new RecycleViewHolder.ClickListener() {
                    @Override
                    public void onItemClick(View view, int position) {
                        ImageView imageView = view.findViewById(R.id.img);
                        TextView title = view.findViewById(R.id.title);

                        Drawable drawable = imageView.getDrawable();
                        Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
                        Intent intent = new Intent(Optimism.this, PostDetails.class);
                        BitmapHelper.getInstance().setBitmap(bitmap);
                        intent.putExtra("title", title.getText().toString());
                        startActivity(intent);
                    }


                });
                return recycleViewHolder;
            }
        };

        recyclerView.setAdapter(firebaseRecyclerAdapter);


    }

    //back botton
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) ;
        finish();
        return super.onOptionsItemSelected(item);

    }

}

Upvotes: 0

Views: 1364

Answers (2)

HedeH
HedeH

Reputation: 3034

As you can see in the Activity Lifecycle attached pic, the onStart is being called when you re-enter your activity:

Android Activity Lifecycle

So you should move all the code from onStart to onCreate, which is called once in your use-case.

You have a code there that refreshes the RecyclerView, recyclerView.setAdapter for instance..

Reference: https://developer.android.com/guide/components/activities/activity-lifecycle

Upvotes: 0

praveen2034
praveen2034

Reputation: 119

When you are going from Activity1 to Activity2 store the selected position in a variable and when you come back from Activity2 to Activity 1 the common method will call is start()

in that method keep this code

recyclerView.getLayoutManager().scrollToPosition(position)

Upvotes: 1

Related Questions