2 Просмотрщик с одним Fuction ()? - PullRequest
0 голосов
/ 26 сентября 2018

Я новичок в разработке Android, я использовал Two Viewholder в своем адаптере ONE FOR PHOTO (PHOTOVIEWHOLDER) , ДРУГОЙ ДЛЯ ВИДЕО (VideoVIEWHOLDER)

МОЯ проблемаесли у меня есть функция, которую ПРОШЕЛ ОДИН ПРОСМОТР (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;
    }
}

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Вы можете создать интерфейс, который будут реализованы обоими вашими владельцами, и иметь одну функцию, которая принимает этот интерфейс в качестве аргумента.

Например:

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

и она должна работать как положено

0 голосов
/ 26 сентября 2018

Определите абстрактный класс типа MyBaseViewHolder, который объявляет методы и атрибуты, найденные в ваших PhotoHolder и VideoViewHolder.

Преобразуйте ваши частные void addNewlike функции в

private void addNewlike(final MyBaseViewHolder holder)

и укажите нужное ViewHolder.

Нажмите на ссылку, чтобы узнать больше об абстрактных классах, они очень полезны!

0 голосов
/ 26 сентября 2018

Пройдите базовый класс VideoViewHolder и PhotoHolder

private void addNewlike(final BaseClass holder)
...