可以为两种视图类型使用一个 viewholder 吗?
Is it ok to use one viewholder for two view type?
我是 android 开发的新手,我想创建一个具有两种视图类型的回收器视图,一种用于视频,另一种用于照片,但是是否有必要为此创建 2 个 Viewholder,我们不能只需为此使用一个 Viewholder ??因为我面临很多问题,比如我需要为 2 个 viewholder 声明此函数两次
相片架
private void addNewlike(final PhotoHolder holder){
Log.d(TAG, "addNewlike: adding new like ");
String newLikeID = mReference.push().getKey();
Likes likes = new Likes();
likes.setUser_id(FirebaseAuth.getInstance().getCurrentUser().getUid());
mReference.child(mContext.getString(R.string.dbname_photos))
.child(holder.photo.getPhoto_id())
.child(mContext.getString(R.string.field_likes))
.child(newLikeID)
.setValue(likes);
mReference.child(mContext.getString(R.string.dbname_user_photos))
.child(holder.photo.getUser_id())
.child(holder.photo.getPhoto_id())
.child(mContext.getString(R.string.field_likes))
.child(newLikeID)
.setValue(likes);
holder.heart.toggleLike();
HashMap<String ,String> notificationData = new HashMap<>();
notificationData.put("from",FirebaseAuth.getInstance().getCurrentUser().getUid());
notificationData.put("type","likes");
notificationData.put("photo_desc",holder.photo.getDescription());
holder.mNotification.child(holder.photo.getUser_id()).setValue(notificationData).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
getLikesString(holder);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
getLikesString(holder);
}
});
}
FOR VideoHolder
private void addNewlike(final VideoHolder holder){
Log.d(TAG, "addNewlike: adding new like ");
String newLikeID = mReference.push().getKey();
Likes likes = new Likes();
likes.setUser_id(FirebaseAuth.getInstance().getCurrentUser().getUid());
mReference.child(mContext.getString(R.string.dbname_photos))
.child(holder.photo.getPhoto_id())
.child(mContext.getString(R.string.field_likes))
.child(newLikeID)
.setValue(likes);
mReference.child(mContext.getString(R.string.dbname_user_photos))
.child(holder.photo.getUser_id())
.child(holder.photo.getPhoto_id())
.child(mContext.getString(R.string.field_likes))
.child(newLikeID)
.setValue(likes);
holder.heart.toggleLike();
HashMap<String ,String> notificationData = new HashMap<>();
notificationData.put("from",FirebaseAuth.getInstance().getCurrentUser().getUid());
notificationData.put("type","likes");
notificationData.put("photo_desc",holder.photo.getDescription());
holder.mNotification.child(holder.photo.getUser_id()).setValue(notificationData).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
getLikesString(holder);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
getLikesString(holder);
}
});
}
你为什么不声明一个公共视图持有者 class 而你将这个 class 扩展到 photoHolder 和 VideoHolder?
你需要一个普通的class:
public class MediaHolder extends RecyclerView.ViewHolder{
// common properties
}
然后为您的 photoHolder 和 VideoHolder 扩展此 class。
那么你应该像这样声明你的方法:
private void addNewlike(final MediaHolder holder)
我建议使用一个自定义 ViewHolder,在该 viewholder 中设置一个变量,然后当您使用该 viewholder 绘图时,只需将照片调整包装在 if(isPhoto) 中{ // 全部处理照片 } else { // 全部处理视频
我是 android 开发的新手,我想创建一个具有两种视图类型的回收器视图,一种用于视频,另一种用于照片,但是是否有必要为此创建 2 个 Viewholder,我们不能只需为此使用一个 Viewholder ??因为我面临很多问题,比如我需要为 2 个 viewholder 声明此函数两次
相片架
private void addNewlike(final PhotoHolder holder){
Log.d(TAG, "addNewlike: adding new like ");
String newLikeID = mReference.push().getKey();
Likes likes = new Likes();
likes.setUser_id(FirebaseAuth.getInstance().getCurrentUser().getUid());
mReference.child(mContext.getString(R.string.dbname_photos))
.child(holder.photo.getPhoto_id())
.child(mContext.getString(R.string.field_likes))
.child(newLikeID)
.setValue(likes);
mReference.child(mContext.getString(R.string.dbname_user_photos))
.child(holder.photo.getUser_id())
.child(holder.photo.getPhoto_id())
.child(mContext.getString(R.string.field_likes))
.child(newLikeID)
.setValue(likes);
holder.heart.toggleLike();
HashMap<String ,String> notificationData = new HashMap<>();
notificationData.put("from",FirebaseAuth.getInstance().getCurrentUser().getUid());
notificationData.put("type","likes");
notificationData.put("photo_desc",holder.photo.getDescription());
holder.mNotification.child(holder.photo.getUser_id()).setValue(notificationData).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
getLikesString(holder);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
getLikesString(holder);
}
});
}
FOR VideoHolder
private void addNewlike(final VideoHolder holder){
Log.d(TAG, "addNewlike: adding new like ");
String newLikeID = mReference.push().getKey();
Likes likes = new Likes();
likes.setUser_id(FirebaseAuth.getInstance().getCurrentUser().getUid());
mReference.child(mContext.getString(R.string.dbname_photos))
.child(holder.photo.getPhoto_id())
.child(mContext.getString(R.string.field_likes))
.child(newLikeID)
.setValue(likes);
mReference.child(mContext.getString(R.string.dbname_user_photos))
.child(holder.photo.getUser_id())
.child(holder.photo.getPhoto_id())
.child(mContext.getString(R.string.field_likes))
.child(newLikeID)
.setValue(likes);
holder.heart.toggleLike();
HashMap<String ,String> notificationData = new HashMap<>();
notificationData.put("from",FirebaseAuth.getInstance().getCurrentUser().getUid());
notificationData.put("type","likes");
notificationData.put("photo_desc",holder.photo.getDescription());
holder.mNotification.child(holder.photo.getUser_id()).setValue(notificationData).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
getLikesString(holder);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
getLikesString(holder);
}
});
}
你为什么不声明一个公共视图持有者 class 而你将这个 class 扩展到 photoHolder 和 VideoHolder?
你需要一个普通的class:
public class MediaHolder extends RecyclerView.ViewHolder{
// common properties
}
然后为您的 photoHolder 和 VideoHolder 扩展此 class。
那么你应该像这样声明你的方法:
private void addNewlike(final MediaHolder holder)
我建议使用一个自定义 ViewHolder,在该 viewholder 中设置一个变量,然后当您使用该 viewholder 绘图时,只需将照片调整包装在 if(isPhoto) 中{ // 全部处理照片 } else { // 全部处理视频