Мне нужно получить изображение пользователя из Firebase, чтобы показать его на ViewHolder после того, как пользователь загрузил свое изображение в профиль деятельности - PullRequest
0 голосов
/ 22 марта 2020

У меня есть активность профиля, когда пользователь загружает свои изображения профиля, пользователь загружает 2 изображения (спереди и сзади), изображения хорошо отображаются в активности профиля, но я также хочу показать одно из этих изображений (сзади или спереди) в другое действие (вид деятельности ViewHolder). Я перепробовал много вещей, но не смог понять, так как я только тестирую, как работает firebase, я очень благодарен, если кто-то может мне здесь помочь.

Вот мой профиль, где пользователь загружает изображения в firebase.

public class ProfileActivity extends AppCompatActivity implements View.OnClickListener{

private ImageView backimage;
private CircleImageView profileimage;
TextView totalscore,correctattempts,totalattempts,user_name,java_score,python_score,php_score,android_score,phone_number;

private Uri filepath;
private final int PICK_IMAGE_REQUEST = 71;
private int id;

StorageReference storageReference;
DatabaseReference users,defaultimages,scoretbl;
String Storage_Path = "All_Image_Uploads/";

// Root Database Name for Firebase Database.
public static final String Database_Path = "All_Image_Uploads_Database";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my_profile);

    storageReference = FirebaseStorage.getInstance().getReference();
    users = FirebaseDatabase.getInstance().getReference("Users");
    defaultimages = FirebaseDatabase.getInstance().getReference("Database_Path");

    java_score=findViewById(R.id.javascore);
    phone_number=findViewById(R.id.user_phonenumber);
    python_score=findViewById(R.id.pythonscore);
    php_score=findViewById(R.id.phpscore);
    android_score =findViewById(R.id.androidscore);

    backimage = findViewById(R.id.header_cover_image);
    profileimage=findViewById(R.id.user_profile_photo);
    totalattempts=findViewById(R.id.questionsattempted);
    correctattempts=findViewById(R.id.correctattempts);
    totalscore=findViewById(R.id.totalscore);
    user_name =findViewById(R.id.user_profile_name);

    backimage.setOnClickListener(this);
    profileimage.setOnClickListener(this);
    user_name.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
    user_name.setText(Common.currentUser.getUserName());

    phone_number.setText(Common.currentUser.getEmail());




    users.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

           /* String score=dataSnapshot.child(Common.currentuser.getUsername()).child("totalScore").getValue().toString();
            totalscore.setText(score);
            String tattempts=dataSnapshot.child(Common.currentuser.getUsername()).child("questionsAttempted").getValue().toString();
            totalattempts.setText(tattempts);
            String cattempts=dataSnapshot.child(Common.currentuser.getUsername()).child("correctAttempts").getValue().toString();
            correctattempts.setText(cattempts);
            phone_number.setText(Common.currentuser.getEmail());

            */
            Picasso.with(getBaseContext()).load(dataSnapshot.child(Common.currentUser.getUserName()).child("pathtobackimage").getValue().toString())
                    .into(backimage);

            Picasso.with(getBaseContext()).load(dataSnapshot.child(Common.currentUser.getUserName()).child("pathtoprofileimage").getValue().toString())
                    .into(profileimage);

        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });


   /*

   scoretbl.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if(dataSnapshot.child("Java").exists())
            java_score.setText(dataSnapshot.child("Java").child("score").getValue().toString());
            if(dataSnapshot.child("Python").exists())
            python_score.setText(dataSnapshot.child("Python").child("score").getValue().toString());
            if(dataSnapshot.child("PHP").exists())
            php_score.setText(dataSnapshot.child("PHP").child("score").getValue().toString());
            if(dataSnapshot.child("Android").exists())
            android_score.setText(dataSnapshot.child("Android").child("score").getValue().toString());

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });



    */

}

private void chooseImage() {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(intent,PICK_IMAGE_REQUEST);

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == PICK_IMAGE_REQUEST&&resultCode ==RESULT_OK
            && data !=null && data.getData()!= null){
        filepath = data.getData();
        if(id==R.id.header_cover_image)
            Picasso.with(this).load(filepath).into(backimage);
        else
            Picasso.with(this).load(filepath).into(profileimage);
    }
}

@Override
public void onClick(View v) {
    switch (v.getId()){
        case R.id.header_cover_image:{
            id = R.id.header_cover_image;
            chooseImage();
            uploadImageback();

            break;
        }
        case R.id.user_profile_photo:{
            id = R.id.user_profile_photo;
            chooseImage();
            uploadImageprofile();

            break;
        }
    }
}

private void uploadImageback() {

    final StorageReference backref = storageReference.child("images/").
            child(Common.currentUser.getUserName()+"/"+ Common.currentUser.getUserName()+"back");

    if(filepath!=null){

        final ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setTitle("Uploading..");
        progressDialog.show();

        backref.putFile(filepath).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                progressDialog.dismiss();
                backref.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri uri) {
                        users.child(Common.currentUser.getUserName()).child("pathtobackimage").setValue(uri.toString());
                        Toast.makeText(ProfileActivity.this,"Uploaded",Toast.LENGTH_LONG).show();
                    }
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Toast.makeText(ProfileActivity.this,"Not Uploaded",Toast.LENGTH_LONG).show();
                    }
                });
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                progressDialog.dismiss();
                Toast.makeText(ProfileActivity.this,"Failure",Toast.LENGTH_LONG).show();
            }
        }).addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                double progress = (100.0*taskSnapshot.getBytesTransferred()/taskSnapshot.getTotalByteCount());
                progressDialog.setMessage("Uploaded "+(int)progress+"%");
            }
        });
    }

}

private void uploadImageprofile() {

    if(filepath!=null){

        final ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setTitle("Uploading.. ");
        progressDialog.show();

        final StorageReference profileref = storageReference.child("images/").
                child(Common.currentUser.getUserName()+"/"+ Common.currentUser.getUserName()+"profile");
        profileref.putFile(filepath).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                progressDialog.dismiss();
                profileref.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri uri) {
                        users.child(Common.currentUser.getUserName()).child("pathtoprofileimage").setValue(uri.toString());
                        Toast.makeText(ProfileActivity.this,"Profile Uploaded",Toast.LENGTH_LONG).show();
                    }
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Toast.makeText(ProfileActivity.this,"Profile not Uploaded",Toast.LENGTH_LONG).show();
                    }
                });
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                progressDialog.dismiss();
                Toast.makeText(ProfileActivity.this,"Failure",Toast.LENGTH_LONG).show();
            }
        }).addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                double progress = (100.0*taskSnapshot.getBytesTransferred()/taskSnapshot.getTotalByteCount());
                progressDialog.setMessage("Uploaded "+(int)progress+" %");
            }
        });
    }

}

}

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

public class RankingViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

public TextView name_text,score_text;
private ItemClickListener itemClickListener;

public RankingViewHolder(View itemView) {
    super(itemView);
    name_text = (TextView) itemView.findViewById(R.id.name_text);
    score_text = (TextView) itemView.findViewById(R.id.score_text);

    itemView.setOnClickListener(this);
}

public void setItemClickListener(ItemClickListener itemClickListener) {
    this.itemClickListener = itemClickListener;
}

@Override
public void onClick(View view) {
    itemClickListener.onClick(view,getAdapterPosition(),false);

}

}

и активность фрагмента

public class RankingFragment extends Fragment {

View myFragment;
FirebaseDatabase database;
RecyclerView rankingList;
LinearLayoutManager layoutManager;
FirebaseRecyclerAdapter<Ranking,RankingViewHolder> adapter;
DatabaseReference questionScore,rankingTable;
int sum = 0; //score is default by zero

public static RankingFragment newInstance(){
    RankingFragment rankingFragment = new RankingFragment();
    return rankingFragment ;
}



@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    database = FirebaseDatabase.getInstance();
    questionScore = database.getReference("Question_Score");
    rankingTable = database.getReference("Ranking");
}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    myFragment = inflater.inflate(R.layout.fragment_ranking,container,false);

    rankingList = (RecyclerView) myFragment.findViewById(R.id.ranking_list);
    layoutManager = new LinearLayoutManager(getActivity());
    rankingList.setHasFixedSize(true);
    //Using orderByChild method , this will sort the ranking in ascending order
    //reverse the data by using layout manager
    layoutManager.setReverseLayout(true);
    layoutManager.setStackFromEnd(true);
    rankingList.setLayoutManager(layoutManager);



    updateScore(Common.currentUser.getUserName(), new RankingCallBack<Ranking>() {
        @Override
        public void callBack(Ranking ranking) {
            //Ranking Score update
            rankingTable.child(ranking.getUserName())
                    .setValue(ranking);
            // showRanking();
        }
    });

    adapter = new FirebaseRecyclerAdapter<Ranking, RankingViewHolder>(
            Ranking.class,
            R.layout.ranking_layout,
            RankingViewHolder.class,
            rankingTable.orderByChild("score")
    ) {
        @Override
        protected void populateViewHolder(RankingViewHolder viewHolder, final Ranking model, int position) {


            viewHolder.name_text.setText(model.getUserName());
            viewHolder.score_text.setText(String.valueOf(model.getScore()));

            //prevent crash when user click
            viewHolder.setItemClickListener(new ItemClickListener() {
                @Override
                public void onClick(View view, int position, boolean isLongClick) {
                    Intent scoreDetail = new Intent(getActivity(),Score_Detail.class);
                    scoreDetail.putExtra("viewUser",model.getUserName());
                    startActivity(scoreDetail);
                }
            });
        }
    };

    adapter.notifyDataSetChanged();
    rankingList.setAdapter(adapter);
    return myFragment;
}



private void updateScore(final String userName, final RankingCallBack<Ranking> callBack) {
    questionScore.orderByChild("user").equalTo(userName)
            .addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    for(DataSnapshot data:dataSnapshot.getChildren())
                    {
                        Question_Score quest = data.getValue(Question_Score.class);
                        sum += Integer.parseInt(quest.getScore());

                    }

                    Ranking ranking = new Ranking(userName,sum);
                    callBack.callBack(ranking);
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });
}

} и вот мой класс ранжирования

public class Ranking {

private String userName;
private long score;
private String urlProfilePic;
public Ranking(){
}

public Ranking(String userName, long score, String pathtobackimage ) {

    this.userName = userName;
    this.score = score;
    this.urlProfilePic = pathtobackimage;
}

public String getUrlProfilePic() {
    return urlProfilePic;
}
public String getUserName() {
    return userName;
}
public void setUserName(String userName) {
    this.userName = userName;
}

public long getScore() {
    return score;
}

public void setScore(long score) {
    this.score = score;
}

}

Здесь снимок экрана, чтобы помочь больше, чем я хотел

My Profile activity

and here is my ranking activity where I want the user profile image to be shown

1 Ответ

0 голосов
/ 22 марта 2020

Я добавил свой комментарий в поле ответа из-за этого ограничения: «Вы должны иметь 50 репутацию, чтобы комментировать».

В любом случае, вернемся к вашему вопросу. Одним из решений было бы сохранить текущий ключ пользователя в файл SharedPreference. В вашем новом Activity используйте этот «ключ» для извлечения данных из Firebase.

РЕДАКТИРОВАТЬ: Добавлено решение

Цитата: «... и я хочу показать одно из этих изображений в моей активности ViewHolder вы можете видеть текстовое представление (отображаются имя и оценка), полученное в результате ранжирования фрагмента ... "

Решение: найдите fixme. В классе RankingViewHolder добавьте:

public class RankingViewHolder extends ...
  //...
  public TextView name_text, score_text;
  public ImageView profileImageView;  //fixme
  //...

  public RankingViewHolder(View itemView) {
    //...
    score_text = (TextView) itemView.findViewById(R.id.score_text);
    profileImageView = (ImageView) itemView.findViewById(R.id.profile_image_view);  //fixme
    //...

Внутри populateViewHolder()

    viewHolder.score_text.setText(String.valueOf(model.getScore()));

    Picasso.with(getContext())  //fixme
        .load(Common.currentUser.getUrlProfilePic())  //fixme
        .into(viewHolder.profileImageView);  //fixme

Внутри RankingFragment класса, так как вы уже используете Common.currentUser.getUserName(), возможно, также создаст другой переменная под ним, чтобы сохранить URL-ссылку на изображение профиля пользователя и получить ссылку с помощью Common.currentUser.getUrlProfilePic().

РЕДАКТИРОВАТЬ # 2:

Изображения, хранящиеся в хранилище FB, имеют следующие ссылки: gs : //FIXME_FIREBASE.com/images/userName/userNameback.jpeg gs: //FIXME_FIREBASE.com/images/userName/userNameprofile.jpeg

Однако использовать в Пикассо нужны такие ссылки: https://firebasestorage.googleapis.com/v0/b/ FIXME / o / FIXME / images / userName / userNameback.jpeg? alt = media & token = FIXME

Вопрос в том, как это получить?

Одним из решений является то, что после успешной загрузки изображения получите URL-адрес загрузки (пример ниже). Сложность в том, что URL-адрес загрузки не доступен сразу, и вам нужно использовать .getMetadata(), .getDownloadUrl() для этого. Как только URL получен, вы должны выяснить, как сохранить эту ссылку в профиле пользователя в вашей базе данных FB.

    @Override
    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

      StorageMetadata storageMetadata = taskSnapshot.getMetadata();

      StorageReference reference = storageMetadata.getReference();
      reference.getDownloadUrl()  // Get the download URL for the file
          .addOnSuccessListener(new OnSuccessListener<Uri>() {
            @Override
            public void onSuccess(Uri uri) {
              Log.i(TAG, uri.toString());  //fixme: save this to user's profile
            }
          });
    }

Внутри populateViewHolder, вы используете модель Ranking, которая содержит имя пользователя и оценка. Измените класс модели Ranking, добавив дополнительную строковую переменную urlProfilePic, которая содержит URL-адрес изображения пользователя (результат выше), и сгенерируйте для него метод получения с именем getUrlProfilePic(). Тогда вы можете использовать его таким образом внутри populateViewHolder:

   viewHolder.score_text.setText(String.valueOf(model.getScore()));

    Picasso.with(getContext())
        .load(model.getUrlProfilePic())  //fixme
        .into(viewHolder.profileImageView);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...