0

I had used this code to cache information locally for firebase recyclerview data

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

But, even though i had made some changes in the data stored in firebase database. It is not being reflected in the recyclerview. I want to delete persistence memory in onDestroy. So, that next time when the app is opended data is fetched from server. UI is similar to playstore ui. Horizontal recyclerviews is added inside of a vertical recyclerview

Updated Code:

//Method for retrieval of firebase database and displaying in recyclerview
private void getFirebaseData() {
    //dialog.show();
    shimmerFrameLayout.startShimmer();
    myData.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            List<ItemGroup> itemGroups = new ArrayList<>();
            for(DataSnapshot groupSnapshot:dataSnapshot.getChildren()){
                ItemGroup itemGroup = new ItemGroup();
                try {
                    itemGroup.setHeaderTitle(groupSnapshot.child("headerTitle").getValue(true).toString());
                }catch (NullPointerException e){
                    Log.e("null",""+e);
                }
                GenericTypeIndicator<ArrayList<ItemData>> genericTypeIndicator = new GenericTypeIndicator<ArrayList<ItemData>>(){};
                itemGroup.setListItem(groupSnapshot.child("listItem").getValue(genericTypeIndicator));
                itemGroups.add(itemGroup);
            }
            ifirebaseLoadListener.onFirebaseLoadSuccess(itemGroups);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            ifirebaseLoadListener.onFirebaseLoadFailed(databaseError.getMessage());
        }
    });
}

@Override
public void onFirebaseLoadSuccess(List<ItemGroup> itemGroupList) {
    MyItemGroupAdapter adapter = new MyItemGroupAdapter(getActivity(), itemGroupList);

    my_recycler_view.setAdapter(adapter);

    shimmerFrameLayout.stopShimmer();
    shimmerFrameLayout.setVisibility(View.GONE);
    //dialog.dismiss();

}

@Override
public void onFirebaseLoadFailed(String message) {
    Toast.makeText(getContext(),message,Toast.LENGTH_SHORT).show();
    shimmerFrameLayout.stopShimmer();
    shimmerFrameLayout.setVisibility(View.GONE);
    //dialog.dismiss();
}

Code of adapter for horizontal recyclerview

public class MyItemAdapter extends RecyclerView.Adapter<MyItemAdapter.MyViewHolder> {

private Context context;
private List<ItemData> itemDataList;
String urlStart = "https://i1.ytimg.com/vi/";
String urlLast = "/mqdefault.jpg";
double screenWidth = 0;
public MyItemAdapter(Context context, List<ItemData> itemDataList) {
    this.context = context;
    this.itemDataList = itemDataList;
}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
    View itemView = LayoutInflater.from(context).inflate(R.layout.layout_item, viewGroup,false);
    DisplayMetrics displayMetrics = new DisplayMetrics();
    screenWidth = getScreenWidth();

    return new MyItemAdapter.MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i) {

    double itemWidth = screenWidth / 3.33;




    myViewHolder.txt_item_title.setText(itemDataList.get(i).vn);
    String urlImage = urlStart+itemDataList.get(i).vi+urlLast;
    Log.e("urlImage",urlImage);
    Glide.with(context)
            .load(urlImage)
            .placeholder(R.drawable.placeholder)
            .error(R.drawable.placeholder)
            .centerCrop()
            .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
            .into(myViewHolder.img_title);

    myViewHolder.setiItemClickListener(new IItemClickListener() {
        @Override
        public void onItemclickListener(View view, int position) {
            Toast.makeText(context,""+itemDataList.get(i).getVn(),Toast.LENGTH_SHORT).show();
        }
    });

}

@Override
public int getItemCount() {
    return (itemDataList != null ? itemDataList.size() : 0);
    }

public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

    TextView txt_item_title;
    ImageView img_title;
    IItemClickListener iItemClickListener;
    CardView itemCardView;

    public void setiItemClickListener(IItemClickListener iItemClickListener) {
        this.iItemClickListener = iItemClickListener;
    }

    public MyViewHolder(@NonNull View itemView) {
        super(itemView);
        txt_item_title = (TextView)itemView.findViewById(R.id.itemTitle);
        img_title = (ImageView)itemView.findViewById(R.id.itemImage);
        itemView = (CardView)itemView.findViewById(R.id.item_cardview);
        itemView.setOnClickListener(this);

    }

    @Override
    public void onClick(View view){
        iItemClickListener.onItemclickListener(view,getAdapterPosition());
    }

}
public static int getScreenWidth() {
    return Resources.getSystem().getDisplayMetrics().widthPixels;
}

}

Code of adapter for vertical recyclerview

public class MyItemGroupAdapter extends RecyclerView.Adapter<MyItemGroupAdapter.MyViewHolder> {

private Context context;
private List<ItemGroup> dataList;
SnapHelper snapHelper;
public MyItemGroupAdapter(Context context, List<ItemGroup> dataList) {
    this.context = context;
    this.dataList = dataList;
}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {

    View itemView = LayoutInflater.from(context).inflate(R.layout.layout_group, viewGroup,false);
    return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i) {

    myViewHolder.item_title.setText(dataList.get(i).getHeaderTitle());

    List<ItemData> itemData = dataList.get(i).getListItem();

    MyItemAdapter itemListAdapter = new MyItemAdapter(context,itemData);

    myViewHolder.recyclerView_item_list.setHasFixedSize(true);
    myViewHolder.recyclerView_item_list.setLayoutManager(new LinearLayoutManager(
            context,LinearLayoutManager.HORIZONTAL,false));
    myViewHolder.recyclerView_item_list.setAdapter(itemListAdapter);
    myViewHolder.recyclerView_item_list.setNestedScrollingEnabled(false);
    snapHelper.attachToRecyclerView(myViewHolder.recyclerView_item_list);
    myViewHolder.btn_more.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(context,"more clicked",Toast.LENGTH_SHORT).show();
        }
    });

}

@Override
public int getItemCount() {
    return (dataList != null ? dataList.size() : 0);
}

public class MyViewHolder extends RecyclerView.ViewHolder {
    TextView item_title;
    Button btn_more;
    RecyclerView recyclerView_item_list;
    public MyViewHolder(@NonNull View itemView) {
        super(itemView);
        snapHelper = new GravitySnapHelper(Gravity.START);
        item_title = itemView.findViewById(R.id.itemTitle);
        btn_more = itemView.findViewById(R.id.btnMore);
        recyclerView_item_list = itemView.findViewById(R.id.recycler_view_list);
    }
}

}

Screenshot:

screenshot of fragment where horizontal & vertical recyclerview is added

DHANANJAY KUMAR
  • 86
  • 1
  • 13

1 Answers1

1

There is no API to reset the Firebase Realtime Database's persistent disk cache. The only way to clear it is to uninstall/reinstall the app.

Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
  • thanks for responding to the issue. Then how am i suppose to use firebase data persistence in a recyclerview. If there are some changes in the values stored in the firebase database, like insertion, deletion of new data or change in the value of the data. – DHANANJAY KUMAR Jun 05 '20 at 15:03
  • 1
    It all depends on how you're listening for the data, which you haven't shared. I'd start by reproducing the problem without disk persistence enabled. Once you do that, post a question with the [minimal, complete code that reproduces the problem](http://stackoverflow.com/help/mcve), so we can have a look. – Frank van Puffelen Jun 05 '20 at 15:20
  • I have added code and screenshots. My app is having a tabbed layout and viewpager. Inside the viewpager there is carousel at top and below that there is vertucal recycler view which contains many horizontal recyclerviews. When i try to change tab and then come back to the tab that i had opened before data is again fetched from firebase database. This retrieval of database again and again while changing of tabs, i'm trying to avoid. – DHANANJAY KUMAR Jun 05 '20 at 15:48
  • 1
    Thanks for that. I realize now that this probably should've been a new post, as it changes the question completely. Either way, the solution is usually to **not** mix `addListenerForSingleValueEvent` with disk persistence. See https://stackoverflow.com/a/34487195 – Frank van Puffelen Jun 05 '20 at 21:28