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;
}
}
传递 VideoViewHolder
和 PhotoHolder
的基数 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,它声明在 PhotoHolder
和 VideoViewHolder
.
中找到的方法和属性
将您的私有 void addNewlike
函数重构为
private void addNewlike(final MyBaseViewHolder holder)
并传入您需要的任何 ViewHolder
。
点击 link 了解更多关于摘要的信息 类,它们非常有用!
我是 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;
}
}
传递 VideoViewHolder
和 PhotoHolder
的基数 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,它声明在 PhotoHolder
和 VideoViewHolder
.
将您的私有 void addNewlike
函数重构为
private void addNewlike(final MyBaseViewHolder holder)
并传入您需要的任何 ViewHolder
。
点击 link 了解更多关于摘要的信息 类,它们非常有用!