Я вроде не очень хорошо справляюсь с обзором реселлера, поэтому моя проблема в том, когда данные добавляются в базу данных Firebase. Представление не обновляется в реальном времени. Мне пришлось переключиться на другой фрагмент, чтобы иметь возможность показывать добавленные данные, а также, когда я переключаюсь на другой фрагмент, когда я go возвращаю первый элемент, дублируется. и когда я go возвращаюсь, он снова дублируется. Я использую шаблон mvvm в моем приложении. Уже 2 дня я ищу проблему, и даже у inte rnet нет правильного решения моей проблемы. Вот мой код.
это мой Адаптер класс .
public class RecipientAdapter extends RecyclerView.Adapter<RecipientAdapter.ViewHolder> {
Context context;
ArrayList<RecipientPost> recipientArrayList;
public RecipientAdapter(Context context, ArrayList<RecipientPost> recipientArrayList) {
this.context = context;
this.recipientArrayList = recipientArrayList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.card_item_data, parent, false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
RecipientPost arrayitems = recipientArrayList.get(position);
holder.name.setText(arrayitems.getName());
holder.body.setText(arrayitems.getBody());
holder.contact.setText(arrayitems.getContact());
holder.location.setText(arrayitems.getLocation());
holder.needs.setText(arrayitems.getNeeds());
holder.onClick(position);
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemCount() {
return recipientArrayList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
MaterialTextView name;
MaterialTextView body;
MaterialTextView contact;
MaterialTextView location;
MaterialTextView needs;
MaterialTextView permission;
MaterialCardView dataholder;
public ViewHolder(@NonNull View itemView) {
super(itemView);
name = itemView.findViewById(R.id.card_item_data_fullname_data);
body = itemView.findViewById(R.id.card_item_data_body_data);
contact = itemView.findViewById(R.id.card_item_data_contact_data);
location = itemView.findViewById(R.id.card_item_data_location_data);
needs = itemView.findViewById(R.id.card_item_data_needs_data);
permission = itemView.findViewById(R.id.card_item_data_permission_data);
dataholder = itemView.findViewById(R.id.card_item_data_card_dataholder);
}
public void onClick(final int position){
dataholder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i(TAG, "position: " +position);
}
});
}
}
Репозиторий Класс:
public class Repository {
static Repository instance;
private ArrayList<RecipientPost> postmodel = new ArrayList<>();
public static Repository getInstance(){
if (instance == null){
instance = new Repository();
}
return instance;
}
public MutableLiveData<ArrayList<RecipientPost>> getPosts() {
populate();
MutableLiveData<ArrayList<RecipientPost>> post = new MutableLiveData<>();
post.setValue(postmodel);
return post;
}
private void populate(){
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
Query query = reference.child("Recipients");
query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()){
RecipientPost model = snapshot.getValue(RecipientPost.class);
if (model.isPermission()){
postmodel.add(model);
} else {
postmodel.remove(model);
}
//postmodel.add(snapshot.getValue(RecipientPost.class));
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
Это мой Фрагмент :
public class HomeFragment extends Fragment {
private RecipientAdapter adapter;
private HomeViewModel homeViewModel;
MaterialButton postbtn;
View view;
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
final NavController navigator = Navigation.findNavController(getActivity(), R.id.nav_host_fragment);
view = inflater.inflate(R.layout.main_fragment_home, container, false);
homeViewModel = ViewModelProviders.of(this).get(HomeViewModel.class);
homeViewModel.init();
postbtn = view.findViewById(R.id.main_fragment_home_btn_post);
postbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
navigator.navigate(R.id.action_navigation_home_to_navigation_postFragment);
}
});
populate();
return view;
}
public void populate(){
initrview();
}
public void initrview(){
RecyclerView recyclerView = view.findViewById(R.id.main_fragment_home_recyclerview);
adapter = new RecipientAdapter(getActivity(), homeViewModel.getPosts().getValue());
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
}
@Override
public void onStop() {
super.onStop();
adapter.notifyDataSetChanged();
}
И это моя модель представления :
public class HomeViewModel extends ViewModel {
MutableLiveData<ArrayList<RecipientPost>> posts;
public void init (){
if (posts != null){
return;
}
posts = Repository.getInstance().getPosts();
}
public LiveData<ArrayList<RecipientPost>> getPosts() {
return posts;
}