我需要在RecyclerView
中添加标题视图,我使用的适配器来自Firebase ui。Firebase ui - 在android中设置FirebaseRecyclerView的设置标题视图
对于正常的RecyclerView
适配器,我只是简单地处理不同的视图类型并处理一些计数/位置偏移。
但是在FirebaseAdapter
中遵循相同的方法似乎是一种不好的做法,在这种情况下最好的方法是什么。
这是我能得到的最接近的。
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;
}
};
,但这是给cannot resolve constructor
问题,但即使解决这个后可能无法正常工作。
所以解决方案的问题在于,每次更改或插入通知时,Firebase发出的指向前一个项目都意味着更改应该是4,它与goto项目5并且还没有找到方法避免这种情况 –