I need to add a header view in RecyclerView
and the adapter I am using is from Firebase ui.
For a normal RecyclerView
adapter I would simply handle different view types and deal with some count/position offsets.
But following the same approach in FirebaseAdapter
seems like a bad practice, what would be the best approach in this case.
This is the closest I could get.
mAdapter = new FirebaseRecyclerAdapter<Comment, RecyclerView.ViewHolder>(Comment.class,
R.layout.item_comment, CommentHolder.class, ref) {
final static int TYPE_HEADER = 0;
final static int TYPE_ITEM = 1;
@Override
protected void populateViewHolder(RecyclerView.ViewHolder viewHolder, Comment comment, int position) {
//cast to comment holder
final CommentHolder commentViewHolder = (CommentHolder) viewHolder;
//initialize view
commentViewHolder.setComment(comment.getComment());
commentViewHolder.setTime(comment.getTimestamp());
//get user details and set view
DatabaseReference ref = FirebaseDatabase.getInstance().getReference(FireContract.PATH_USER_PROFILE)
.child(comment.getUserKey());
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
User user = dataSnapshot.getValue(User.class);
if(user != null) {
commentViewHolder.setName(user.getName());
commentViewHolder.setUsername("@" + user.getUsername());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
//return header view holder is type is header else return super from firebase ui
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if(viewType == TYPE_HEADER){
View view = LayoutInflater.from(getActivity()).inflate(R.layout.post_details,
parent, false);
return new PostViewHolder(view);
}
else
return super.onCreateViewHolder(parent, viewType);
}
//initialize post details as header if position is 0 else call super with position less
//by one to cater for the header offset
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
if(position == 0)
initializePostDetails((PostViewHolder) viewHolder);
else
super.onBindViewHolder(viewHolder, position - 1);
}
//return view type header if position is 0 else call super from firebase ui
@Override
public int getItemViewType(int position) {
if(position == 0)
return TYPE_HEADER;
return super.getItemViewType(position - 1);
}
//set count equal to 1 plus actual list items, 1 is added for header view
@Override
public int getItemCount() {
return super.getItemCount() + 1;
}
};
but this is giving a cannot resolve constructor
issue but it may not work even after resolving this.