有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将ListView适配器移植到RecyclerView适配器

我想知道如何将我的脚本(mainfeedapter.class)从一个ListView{}移植到一个RecyclerView{},我给了它一些镜头,但我无法移植它

我需要做什么才能让它工作?提前谢谢

我希望我能很好地解释我的问题,否则我会改变它

MainfeedListAdapter。班级

public class MainfeedListAdapter extends ArrayAdapter<Photo> {
private static final String TAG = "MainfeedListAdapter";

private LayoutInflater mInflater;
private int mLayoutResource;
private Context mContext;
private DatabaseReference mReference;
private String currentUsername;

public MainfeedListAdapter(@NonNull Context context, @LayoutRes int resource, @NonNull List<Photo> objects) {
    super(context, resource, objects);
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    mLayoutResource = resource;
    this.mContext = context;
    mReference = FirebaseDatabase.getInstance().getReference();

}

static class Viewholder{
    ImageView mProfileImage;
    String likesString;
    TextView username, timeDelta, caption, likes, liked;
    ImageView postImage;
    ImageView heartRed, heartWhite;

    UserAccountSettings settings = new UserAccountSettings();
    User user = new User();
    StringBuilder users;
    String mLikesString;
    boolean likeByCurrentUser;
    Heart heart;
    GestureDetector detector;
    Photo photo;
}

@NonNull
@Override
public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {

    final Viewholder holder;

    if(convertView == null){
        convertView = mInflater.inflate(mLayoutResource, parent, false);
        holder = new Viewholder();

        holder.username = (TextView) convertView.findViewById(R.id.display_name);
        holder.postImage = (ImageView) convertView.findViewById(R.id.post_image);
        holder.caption = (TextView) convertView.findViewById(R.id.image_caption);
        holder.timeDelta = (TextView) convertView.findViewById(R.id.image_time_posted);
        holder.likes = (TextView) convertView.findViewById(R.id.tvLikesString);
        holder.mProfileImage = (ImageView) convertView.findViewById(R.id.f_profile_image);
        holder.heartRed = (ImageView) convertView.findViewById(R.id.image_heart_red);
        holder.heartWhite = (ImageView) convertView.findViewById(R.id.image_heart_white);
        holder.heart = new Heart(holder.heartWhite, holder.heartRed);
        holder.liked = (TextView) convertView.findViewById(R.id.likeText);
        holder.photo = getItem(position);
        holder.detector = new GestureDetector(mContext, new GestureListener(holder));

        convertView.setTag(holder);

    }else{
        holder = (Viewholder) convertView.getTag();
    }

    getCurrentUsername();

    getLikesString(holder);

    holder.caption.setText(getItem(position).getCaption());

    String timestampDifference = getTimestampDifference(getItem(position));
    if(!timestampDifference.equals("0")){
        holder.timeDelta.setText(timestampDifference + " DAYS AGO");
    }else{
        holder.timeDelta.setText("TODAY");
    }

    final ImageLoader imageLoader = ImageLoader.getInstance();
    imageLoader.displayImage(getItem(position).getImage_path(), holder.postImage);


    //get the profile image and username
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
    Query query = reference
            .child(mContext.getString(R.string.dbname_user_account_settings))
            .orderByChild(mContext.getString(R.string.field_user_id))
            .equalTo(getItem(position).getUser_id());
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Log.e(TAG, "onDataChange: OnDataChange ******************************************************************************");
            for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){


                Log.e(TAG, "onDataChange: found user: "
                        + singleSnapshot.getValue(UserAccountSettings.class).getUsername() + "****************************");

                holder.username.setText(singleSnapshot.getValue(UserAccountSettings.class).getUsername());


                imageLoader.displayImage(singleSnapshot.getValue(UserAccountSettings.class).getProfile_photo(),
                        holder.mProfileImage);

                holder.settings = singleSnapshot.getValue(UserAccountSettings.class);

            }

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    Query userQuery = mReference
            .child(mContext.getString(R.string.dbname_users))
            .orderByChild(mContext.getString(R.string.field_user_id))
            .equalTo(getItem(position).getUser_id());
    userQuery.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
                Log.d(TAG, "onDataChange: found user: " +
                        singleSnapshot.getValue(User.class).getUsername());

                holder.user = singleSnapshot.getValue(User.class);
            }

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });



    return convertView;
}

//----------------------------------------Likes---------------------------

public class GestureListener extends GestureDetector.SimpleOnGestureListener{

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

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

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

        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.likeByCurrentUser &&
                            singleSnapshot.getValue(Like.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();
                             .removeValue();

                        mReference.child(mContext.getString(R.string.dbname_user_photos))
                                .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.likeByCurrentUser){
                        //add new like
                        addNewLike(mHolder);
                        break;
                    }
                }
                if(!dataSnapshot.exists()){
                    //add new like
                    addNewLike(mHolder);
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

        return true;
    }
}

private void addNewLike(final Viewholder holder){
    Log.d(TAG, "addNewLike: adding new like");

    String newLikeID = mReference.push().getKey();
    Like like = new Like();
    like.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(like);

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

    holder.heart.toggleLike();
    getLikesString(holder);
}

private void getCurrentUsername(){
    Log.d(TAG, "getCurrentUsername: retrieving user account settings");
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
    Query query = reference
            .child(mContext.getString(R.string.dbname_users))
            .orderByChild(mContext.getString(R.string.field_user_id))
            .equalTo(FirebaseAuth.getInstance().getCurrentUser().getUid());
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
                currentUsername = singleSnapshot.getValue(UserAccountSettings.class).getUsername();
            }

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

private void getLikesString(final Viewholder holder){
    Log.d(TAG, "getLikesString: getting likes string");

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

                    DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
                    Query query = reference
                            .child(mContext.getString(R.string.dbname_users))
                            .orderByChild(mContext.getString(R.string.field_user_id))
                            .equalTo(singleSnapshot.getValue(Like.class).getUser_id());
                    query.addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
                                Log.d(TAG, "onDataChange: found like: " +
                                        singleSnapshot.getValue(User.class).getUsername());

                                holder.users.append(singleSnapshot.getValue(User.class).getUsername());
                                holder.users.append(",");
                            }

                            String[] splitUsers = holder.users.toString().split(",");

                            if(holder.users.toString().contains(currentUsername + ",")){//mitch, mitchell.tabian
                                holder.likeByCurrentUser = true;
                            }else{
                                holder.likeByCurrentUser = false;
                            }

                            int length = splitUsers.length;
                            if(length == 1){
                                holder.likesString = "Liked by " + splitUsers[0];
                            }
                            else if(length == 2){
                                holder.likesString = "Liked by " + splitUsers[0]
                                        + " and " + splitUsers[1];
                            }
                            else if(length == 3){
                                holder.likesString = "Liked by " + splitUsers[0]
                                        + ", " + splitUsers[1]
                                        + " and " + splitUsers[2];

                            }
                            else if(length == 4){
                                holder.likesString = "Liked by " + splitUsers[0]
                                        + ", " + splitUsers[1]
                                        + ", " + splitUsers[2]
                                        + " and " + splitUsers[3];
                            }
                            else if(length > 4){
                                holder.likesString = "Liked by " + splitUsers[0]
                                        + ", " + splitUsers[1]
                                        + ", " + splitUsers[2]
                                        + " and " + (splitUsers.length - 3) + " others";
                            }
                            Log.d(TAG, "onDataChange: likes string: " + holder.likesString);
                            //setup likes string
                            setupLikesString(holder, holder.likesString);
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });
                }
                if(!dataSnapshot.exists()){
                    holder.likesString = "";
                    holder.likeByCurrentUser = false;
                    //setup likes string
                    setupLikesString(holder, holder.likesString);
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }catch (NullPointerException e){
        Log.e(TAG, "getLikesString: NullPointerException: " + e.getMessage() );
        holder.likesString = "";
        holder.likeByCurrentUser = false;
        //setup likes string
        setupLikesString(holder, holder.likesString);
    }
}

private void setupLikesString(final Viewholder holder, String likesString) {
    Log.d(TAG, "setupLikesString: likes string:" + holder.likesString);

    if (holder.likeByCurrentUser) {
        Log.d(TAG, "setupLikesString: photo is liked by current user");
        holder.liked.setText("UnLike");
        holder.heartWhite.setVisibility(View.GONE);
        holder.heartRed.setVisibility(View.VISIBLE);
        holder.heartRed.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return holder.detector.onTouchEvent(event);
            }
        });
    } else {
        Log.d(TAG, "setupLikesString: photo is not liked by current user");
        holder.liked.setText("Like");
        holder.heartWhite.setVisibility(View.VISIBLE);
        holder.heartRed.setVisibility(View.GONE);
        holder.heartWhite.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return holder.detector.onTouchEvent(event);
            }
        });
    }
    holder.likes.setText(likesString);

}


    //---------------------------------------------end of likes----------------------------

private String getTimestampDifference(Photo photo){
    Log.d(TAG, "getTimestampDifference: getting timestamp difference.");

    String difference = "";
    Calendar c = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.CANADA);
    sdf.setTimeZone(TimeZone.getTimeZone("Canada/Pacific"));//google '安卓 list of timezones'
    Date today = c.getTime();
    sdf.format(today);
    Date timestamp;
    final String photoTimestamp = photo.getDate_created();
    try{
        timestamp = sdf.parse(photoTimestamp);
        difference = String.valueOf(Math.round(((today.getTime() - timestamp.getTime()) / 1000 / 60 / 60 / 24 )));
    }catch (ParseException e){
        Log.e(TAG, "getTimestampDifference: ParseException: " + e.getMessage() );
        difference = "0";
    }
    return difference;
}

}


共 (1) 个答案

  1. # 1 楼答案

    我不知道你说的移植是什么意思,但是如果你有一个listview,现在想使用recycler视图来提高性能。您可以按照这个google sample codeguide for recycler view进行操作。listview和recycler视图的适配器非常相似,因此您可以重用大部分代码