Хорошо, поэтому я пытаюсь создать функцию подписчика / подписчика (не совсем лучший подход) и продолжаю сталкиваться с проблемами, когда дело доходит до извлечения данных из базы данных Firebase.Я использую RecyclelerView, который показывает всех пользователей, каждый пользователь имеет кнопку «следовать / следовать».Проблема, с которой я сталкиваюсь, заключается в проверке того, подписан ли уже пользователь или нет.Я разберусь с кодом ниже
ViewHolder для RecyclerView
@Override
public UserViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(getContext())
.inflate(R.layout.artist_list_single, parent, false);
TextView username = (TextView) view.findViewById(R.id.all_users_name);
username.setTypeface(notes_font);
return new UserViewHolder(view);
}
@Override
protected void onBindViewHolder(@NonNull UserViewHolder holder, int position, @NonNull Users model) {
final String current_uid = currentUser.getUid();
final String user_uid = getRef(position).getKey();
final String test = mUserDatabase.child(current_uid).child("following").child(user_uid).getKey();
final Button follow_following = (Button) holder.mView.findViewById(R.id.follow_button);
follow_following.setTypeface(notes_font);
follow_following.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!test.equals(user_uid)) {
Toast.makeText(getActivity(), test, Toast.LENGTH_LONG).show();
mUserDatabase.child(current_uid).child("following").child(user_uid).setValue("true").addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
mUserDatabase.child(user_uid).child("follower").child(current_uid).setValue("true");
follow_following.setBackgroundResource(R.drawable.login_button);
follow_following.setTextColor(getResources().getColor(R.color.white));
follow_following.setText("Following");
} else {
Toast.makeText(getActivity(), "Error", Toast.LENGTH_LONG).show();
}
}
});
} else if (test.equals(user_uid)) {
Toast.makeText(getActivity(), test, Toast.LENGTH_LONG).show();
AlertDialog.Builder dialog = new AlertDialog.Builder(getActivity())
.setTitle("Unfollow?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mUserDatabase.child(current_uid).child("following").child(user_uid).removeValue().addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
follow_following.setBackgroundResource(R.drawable.round_outline);
follow_following.setTextColor(getResources().getColor(R.color.app_theme));
follow_following.setText("Follow");
} else {
Toast.makeText(getActivity(), "Error", Toast.LENGTH_LONG).show();
}
}
});
}
})
.setNegativeButton("No", null)
.setCancelable(false);
dialog.show();
}
}
});
holder.setName(model.getName());
holder.setThumbImage(model.getThumbImage());
holder.setStatus(model.getStatus());
holder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent profileIntent = new Intent(getActivity(), All_Profiles.class);
profileIntent.putExtra("user_uid", user_uid);
startActivity(profileIntent);
}
});
}
};
Так что при получении тестовой строки, находится ли User_uid в базе данных или нет, он обнаруживает этот test.equals (user_uid)верно .. не уверен, где я ошибся там.Итак, затем я попытался использовать ValueEventListening для извлечения данных с помощью onDataChange () следующим образом:
@Override
protected void onBindViewHolder(@NonNull UserViewHolder holder, int position, @NonNull Users model) {
final String current_uid = currentUser.getUid();
final String user_uid = getRef(position).getKey();
final String test = mUserDatabase.child(current_uid).child("following").child(user_uid).getKey();
mUserDatabase.child(current_uid).child("following").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
testing = dataSnapshot.child(user_uid).getKey();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
final Button follow_following = (Button) holder.mView.findViewById(R.id.follow_button);
follow_following.setTypeface(notes_font);
follow_following.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mUserDatabase.child(current_uid).child("following").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
testing = dataSnapshot.child(user_uid).getKey();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
if (!testing.equals(user_uid)) {
Toast.makeText(getActivity(), testing, Toast.LENGTH_LONG).show();
mUserDatabase.child(current_uid).child("following").child(user_uid).setValue("true").addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
mUserDatabase.child(user_uid).child("follower").child(current_uid).setValue("true");
follow_following.setBackgroundResource(R.drawable.login_button);
follow_following.setTextColor(getResources().getColor(R.color.white));
follow_following.setText("Following");
} else {
Toast.makeText(getActivity(), "Error", Toast.LENGTH_LONG).show();
}
}
});
} else if (testing.equals(user_uid)) {
Toast.makeText(getActivity(), testing, Toast.LENGTH_LONG).show();
AlertDialog.Builder dialog = new AlertDialog.Builder(getActivity())
.setTitle("Unfollow?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mUserDatabase.child(current_uid).child("following").child(user_uid).setValue("false").addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
follow_following.setBackgroundResource(R.drawable.round_outline);
follow_following.setTextColor(getResources().getColor(R.color.app_theme));
follow_following.setText("Follow");
} else {
Toast.makeText(getActivity(), "Error", Toast.LENGTH_LONG).show();
}
}
});
}
})
.setNegativeButton("No", null)
.setCancelable(false);
dialog.show();
}
}
});
holder.setName(model.getName());
holder.setThumbImage(model.getThumbImage());
holder.setStatus(model.getStatus());
holder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent profileIntent = new Intent(getActivity(), All_Profiles.class);
profileIntent.putExtra("user_uid", user_uid);
startActivity(profileIntent);
}
});
}
примечание: я вызывал его дважды, потому что, вызывая его только один раз, по какой-то причине onClick извлекал только ключ первого пользователя.и вызывая его только один раз во время каждого сбоя onClick.звонить по нему дважды отчасти сработало для меня, за исключением того, что каждый раз, когда я нажимаю кнопку, ключ не обновляется, пока я не нажму на него дважды ... в общем, я действительно в растерянности.прошу прощения за мое невежество, так как я все еще учусь, я знаю, что мой код не идеален (или даже близко смеется), поэтому, пожалуйста, имейте это в виду.Кроме того, я читал официальную документацию по Firebase и Android обо всем, что я пытаюсь сделать больше недели, я бы не приехал сюда, если бы не сделал этого.Спасибо всем заранее за любую помощь, вы можете предоставить:)
вот изображение моей базы данных