可以为两种视图类型使用一个 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 { // 全部处理视频