4

I want to display a Loading view i.e., an indeterminate Progress bar until I load my recycler view with data fetched from Firebase. I need to know the event which would be triggered as soon as the Recycler View is loaded with the data.

I extended this class and used as an adapter

https://github.com/mmazzarolo/firebase-recyclerview/blob/master/app/src/main/java/com/example/matteo/firebase_recycleview/FirebaseRecyclerAdapter.java

My extended class is

public class TrendingRecycler extends FirebaseRecyclerAdapter
    <TrendingRecycler.ViewHolder, DataStuff> {


public static class ViewHolder extends RecyclerView.ViewHolder {

    TextView Data;


    public ViewHolder(View view) {
        super(view);

        Data= (TextView) view.findViewById(R.id.text_card_trending);
    }
}

public TrendingRecycler(Query query, Class<DataStuff> itemClass) {
    super(query, itemClass);
}


@Override public TrendingRecycler.ViewHolder
onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.trending_card_view, parent, false);

    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(TrendingRecycler.ViewHolder holder,
                                       int position) {


    final DataStuff item = getItem(position);
    holder.Data.setText(item.Data);
    final Context context =holder.itemView.getContext();

    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Toast.makeText(MyApplication.getAppContext(),
                    item.Tags.toString(), Toast.LENGTH_LONG).show();
            TempShowStore.setDataStuff(item);
            context.startActivity(
                    new Intent(context, ShowComplete.class)
            );
        }
    });
}

@Override
protected void itemAdded(DataStuff item, String key, int position) {
    Log.d("ADDED",String.valueOf(position));
}

@Override
protected void itemChanged(DataStuff oldItem, DataStuff newItem, String key, int position) {
    Log.d("CHANGED",String.valueOf(position));
}

@Override
protected void itemRemoved(DataStuff item, String key, int position) {
    Log.d("REMOVED",String.valueOf(position));
}

@Override
protected void itemMoved(DataStuff item, String key, int oldPosition, int newPosition) {
    Log.d("MOVED",String.valueOf(oldPosition) + " to " +String.valueOf(newPosition));
}

}
Mohammad Aasif
  • 328
  • 2
  • 3
  • 15

3 Answers3

5

You have to try overriding onDataChanged() in your adapter:

mProgressDialog.show();
mFirebaseAdapter = new FirebaseRecyclerAdapter(...) {

@Override
protected void populateViewHolder(...) {...}

@Override
protected void onDataChanged() {
    if (mProgressDialog != null && mProgressDialog.isShowing()) {
        mProgressDialog.dismiss();
    }
  }

};
Maforast
  • 257
  • 1
  • 6
  • 17
1

Register the AdapterdataObserver to the RecyclerView.Adapter

protected RecyclerView.AdapterDataObserver observer= new RecyclerView.AdapterDataObserver() {
    @Override
    public void onChanged() {
        //called When the data in the adapter is changed
    }
};

yourAdapter.registerAdapterDataObserver(observer);
Jagadesh Seeram
  • 2,630
  • 1
  • 16
  • 29
  • onChanged would be called when data set of adapter changes but I need to know when the adapter would bind with the recycler view. Apologies if I am wrong I am a real amateur – Mohammad Aasif Feb 19 '16 at 13:46
0

I figured out that onItemRangeInserted method works. I use it to detect when first item was added to the RecyclerView:

private void setupProgress() {
    vProgress.show();
    mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {

        @Override
        public void onItemRangeInserted(int positionStart, int itemCount) {
            super.onItemRangeInserted(positionStart, itemCount);
            vProgress.hide();
            mAdapter.unregisterAdapterDataObserver(this);
        }
    });
}
David Vávra
  • 18,446
  • 7
  • 48
  • 56
  • 1
    This is not working for me. The progress dialog box doesn't disappear even when the content in recyclerview is visible. Is there a workaround? I'm using FirebaseRecyclerAdapter from FirebaseUI library. – Neha Agarwal Nov 20 '16 at 18:43
  • This will only work if you have at least 1 item, if there are no items then it wont be called – htafoya Jan 08 '17 at 23:55