Mohammed_Muzaffar
Mohammed_Muzaffar

Reputation: 65

Firebase list of data is unable to load in Custom recycler adaper

I am trying to load firebase list of data in my custom recycler adapter but I am unable to load it.

this code is displaying data in my logcat but I am unable to load in my app. logcat showing no errors though. If I use firebase UI and try to do this thing then it is working fine but I want to inset native ads in recycler view to I had to migrate to custom adapter and now I am stuck with this issue. :(

my custom recycler adapet.

public class AuthorNameCustomRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

ArrayList<AuthorsCLA> authorlist;
Context mcontext;


public class NamesHolder extends RecyclerView.ViewHolder {
    public TextView name;

    public NamesHolder(View itemView) {

        super(itemView);
        name = (TextView)itemView.findViewById(R.id.authorNameTextView);
    }
}

public AuthorNameCustomRecyclerAdapter(ArrayList<AuthorsCLA> authorlist, Context mcontext) {
    this.authorlist = authorlist;
    this.mcontext = mcontext;
}


@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    RecyclerView.ViewHolder viewHolder = null;
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    switch (viewType) {
        case 1: {
            View view = inflater.inflate(R.layout.author_list_cv, parent, false);
            viewHolder = new NamesHolder(view);
            break;
        }
    }
    return viewHolder;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
     final AuthorsCLA authorsModel = authorlist.get(holder.getAdapterPosition());



    switch (holder.getItemViewType()){
        case 1:{
            NamesHolder nameHolder = (NamesHolder) holder;
            nameHolder.name.setText(authorsModel.getAuthorname());
            nameHolder.name.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(view.getContext(), AuthorQuotesDetailActvity.class);
                    mcontext.startActivity(intent);



                }
            });
        }
    }
}



@Override
public int getItemCount() {
    return authorlist.size();
}

}

here is the class where i am calling custom recycler adapter.

public class AuthorsList extends AppCompatActivity {

private RecyclerView recyclerViewAuthor;
private StaggeredGridLayoutManager mlayoutManager;
private GridLayoutManager manager;
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference mdatabaseReference = database.getReference();
private AdView mAdView;
private RecyclerView.Adapter adapter;
private ArrayList<AuthorsCLA> authorlist;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.authors_list);
    MobileAds.initialize(this, "ca-app-pub-7854400750152181~4721849113");
    mAdView = (AdView) findViewById(R.id.adView1);
    AdRequest adRequest = new AdRequest.Builder().addTestDevice("2A79E20CADE70C60CF36B2E8EE9103FF").build();
    mAdView.loadAd(adRequest);


    recyclerViewAuthor = (RecyclerView) findViewById(R.id.authorsRecyclerView);

    DatabaseReference mListItemRef = mdatabaseReference.child("en/of");

    authorlist = new ArrayList<>();


    manager = new GridLayoutManager(this,2);

    recyclerViewAuthor.setLayoutManager(manager);


    ChildEventListener childEventListener = new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {

            Log.d("Added",dataSnapshot.getKey());
            fetchData(dataSnapshot);

        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    };

    mListItemRef.addChildEventListener(childEventListener);


    adapter = new AuthorNameCustomRecyclerAdapter(authorlist, this);

    recyclerViewAuthor.setAdapter(adapter);



}

private void fetchData(DataSnapshot dataSnapshot) {

    AuthorsCLA listItem=dataSnapshot.getValue(AuthorsCLA.class);
    authorlist.add(listItem);
  //  recyclerViewAuthor.setAdapter(adapter);

}

}

Upvotes: 0

Views: 40

Answers (1)

Paresh
Paresh

Reputation: 6857

onChildAdded() will be called each time when the child is fetched by firebase call. This is asynchronous process.

In your code you are adding it into ArrayList<>, but somehow you are not notifying the adapter that child is being added. It is safe to do that in your

private void fetchData(DataSnapshot dataSnapshot) {
   AuthorsCLA listItem = dataSnapshot.getValue(AuthorsCLA.class);
   authorlist.add(listItem);
   adapter.notifyItemInserted(authorlist.size() - 1); // Notify the adapter
}

Upvotes: 1

Related Questions