gpt4 book ai didi

android - Firebase ui - 在 android 中为 FirebaseRecyclerView 设置标题 View

转载 作者:行者123 更新时间:2023-11-29 01:14:43 26 4
gpt4 key购买 nike

我需要在 RecyclerView 中添加标题 View ,我使用的适配器来自 Firebase ui。

对于普通的 RecyclerView 适配器,我会简单地处理不同的 View 类型并处理一些计数/位置偏移。

但是在 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 问题,但即使在解决这个问题之后它也可能无法工作。

最佳答案

因此,这就是我能够将我的适配器升级到的目标,它确实对我有用,但不确定它是否仍然是实现此目标的最佳方法。如果有人可以验证这一点或者可以提出更好更简单的解决方案,那就太好了

mAdapter = new FirebaseRecyclerAdapter<Comment, RecyclerView.ViewHolder>(Comment.class,
R.layout.item_comment, RecyclerView.ViewHolder.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) {
Log.d(TAG, "running populateViewHolder");
}

//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);
}
//if type is not header its item view, so return commentHolder instance
else{
View view = LayoutInflater.from(getActivity()).inflate(R.layout.item_comment,
parent, false);

return new CommentHolder(view);
}

}

//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 holder is post view holder, initialize header
if(viewHolder instanceof PostViewHolder)
initializePostDetails((PostViewHolder) viewHolder);

else{
//cast to comment holder
final CommentHolder commentViewHolder = (CommentHolder) viewHolder;
Comment comment = getItem(position);

//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 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 TYPE_ITEM;
}

//set count equal to 1 plus actual list items, 1 is added for header view
@Override
public int getItemCount() {
return super.getItemCount() + 1;
}

//return comment item, decrement 1 from position to avoid out of rand exception as it was
//incremented for adding header
@Override
public Comment getItem(int position) {
return super.getItem(position - 1);
}
};

关于android - Firebase ui - 在 android 中为 FirebaseRecyclerView 设置标题 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40611086/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com