Recyclerview не обновляется в реальном времени, а также дублируется (MVVM) - PullRequest
0 голосов
/ 31 марта 2020

Я вроде не очень хорошо справляюсь с обзором реселлера, поэтому моя проблема в том, когда данные добавляются в базу данных 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...