【发布时间】:2017-03-29 09:49:06
【问题描述】:
我需要在RecyclerView 中添加一个标题视图,并且我使用的适配器来自 Firebase ui。
对于普通的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 问题,但即使在解决此问题后也可能无法正常工作。
【问题讨论】:
标签: android firebase firebase-realtime-database firebaseui