2 一个 Function() 的 Viewholder?

2 Viewholder with one Fuction()?

我是 android 开发的新手,我在我的适配器中使用了两个 Viewholder 一个用于照片 (PHOTOVIEWHOLDER) ,另一个用于视频 (VideoVIEWHOLDER )

我的问题是我有一个功能我已经通过了一个 VIEWHOLDER (Photoviewholder) 我需要对我的 (VideoViewholder) 使用同样的功能。 与其重复相同的功能两次,我想还有其他方法我可以做到这一点

  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();
}


  private void addNewlike(final VideoViewHolder 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();
}





 public class GestureListener extends GestureDetector.SimpleOnGestureListener{

    PhotoHolder mHolder;
    public GestureListener(PhotoHolder holder) {
        mHolder = holder;
    }

    @Override
    public boolean onDown(MotionEvent e) {
        return true;
    }

    @Override
    public boolean onDoubleTap(MotionEvent e) {
        Log.d(TAG, "onDoubleTap: double tap detected.");

        Log.d(TAG, "onDoubleTap: clicked on photo: " + mHolder.photo.getPhoto_id());

         DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
        Query query = reference
                .child(mContext.getString(R.string.dbname_photos))
                .child(mHolder.photo.getPhoto_id())
                .child(mContext.getString(R.string.field_likes));
        query.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){

                    String keyID = singleSnapshot.getKey();
                    //case1: Then user already liked the photo
                    if(mHolder.likephotobycurrentUser
                            && singleSnapshot.getValue(Likes.class).getUser_id()
                                    .equals(FirebaseAuth.getInstance().getCurrentUser().getUid())
                            ){
                        mReference.child(mContext.getString(R.string.dbname_photos))
                                .child(mHolder.photo.getPhoto_id())
                                .child(mContext.getString(R.string.field_likes))
                                .child(keyID)
                                .removeValue();
  ///                         mReference.child(mContext.getString(R.string.dbname_user_photos))
 //                                    .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                                .child(mHolder.photo.getUser_id())
                                .child(mHolder.photo.getPhoto_id())
                                .child(mContext.getString(R.string.field_likes))
                                .child(keyID)
                                .removeValue();


                        mHolder.heart.toggleLike();
                        getLikesString(mHolder);
                    }
                    //case2: The user has not liked the photo
                    else if(!mHolder.likephotobycurrentUser){
                        //add new like
                        addNewlike(mHolder);
                        break;
                    }
                }
                if(!dataSnapshot.exists()){
                    //add new like
                    addNewlike(mHolder);
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

        return true;
    }
}

传递 VideoViewHolderPhotoHolder 的基数 class

private void addNewlike(final BaseClass holder)

您可以创建一个双方都将实现的接口,并拥有一个以该接口为参数的函数。

例如:

public interface MyInterface {
    Photo getPhoto(); // I assume your holder.photo returns a photo class here but feel free to replace by whatever is correct
    Heart getHeart();
}

那么各位持有者:

public PhotoHolder implements MyInterface { // keep extension if you have one
    Photo photo;
    Heart heart;
    // all your previous methods

    // implement the interface
    @Override
    public Photo getPhoto() { return photo; }

    @Override
    public Heart getHeart() { return heart; }
}

最后是你的函数:

private void addNewlike(final MyInterface 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.getPhoto().getPhoto_id())
            .child(mContext.getString(R.string.field_likes))
            .child(newLikeID)
            .setValue(likes);
    mReference.child(mContext.getString(R.string.dbname_user_photos))
            .child(holder.getPhoto().getUser_id())
            .child(holder.getPhoto().getPhoto_id())
            .child(mContext.getString(R.string.field_likes))
            .child(newLikeID)
            .setValue(likes);
    holder.getPhoto().toggleLike();
}

它应该按预期工作

定义 MyBaseViewHolder 类型的 abstract class,它声明在 PhotoHolderVideoViewHolder.

中找到的方法和属性

将您的私有 void addNewlike 函数重构为

private void addNewlike(final MyBaseViewHolder holder)

并传入您需要的任何 ViewHolder

点击 link 了解更多关于摘要的信息 类,它们非常有用!