Jestem początkującym i pracuję nad projektem Android. Tworzę kartę ogłoszenia z tytułem pola, opis, lokalizację wydarzenia, czas zdarzenia. Idea jest administrowaniem aplikacji ogłosić niektóre ogłoszenia, a wszyscy użytkownicy aplikacji otrzymają ogłoszenia.

Istnieją pewne sytuacje, w których lokalizacja pól i czas pól wydarzenia są puste. Więc stworzyłem dwa karty Cardview, aby pokazać ogłoszenia. Jeden z tymi polami i innym bez tych dwóch pól. Więc za każdym razem, gdy administrator nie wprowadza tych dwóch pól, Adapter powinien przełączyć się na widok drugiego karty i powinno być wyświetlane w widoku recyklejcji. Ale recykler pokazuje tylko jeden widok, nawet jeśli pola czasu i lokalizacji nie są obecne.

Snapshot karty Cardview ze wszystkimi polami

Snapshot karty Cardview bez lokalizacji i pól czasowych

Onbindviewholder:

Dodano nazwę flagi boolowskiej flagdateLokalizacja , aby wiedzieć, czy te dwa pola są null lub nie. Jeśli więc te pola są NULL, wykonałem flagdatelokalizację jako false, przekazując go do OnCreateViewerCer , aby zdecydować o wyborze Cardview do wyboru. Zadeklarowałem flagdatelokalizację jako zmienną globalną w klasie i nosi go z prawdą. (Nie statyczne)

Uwaga: Jeśli nie zainicjuję flagi jako prawdą, otrzymuję wyjątek wskaźnika zerowego.

 boolean flagdateLocation=true;

 protected void onBindViewHolder(@NonNull AnnounceHolder holder, int position, @NonNull Announcements model) {
     holder.textViewTitle.setText(model.getTitle());
     holder.textViewDesc.setText(model.getDescription());
    Log.d(TAG, "onBindViewHolder: "+model.getLocation()+" "+model.getDate());
     if (model.getDate()!=null&&model.getLocation()!=null){
         flagdateLocation = true;
         holder.textViewLocation.setText(model.getLocation());
         holder.textViewDate.setText(model.getDate());

     }
     else{
         flagdateLocation = false;
     }

    Log.d(TAG, "onBindViewHolder: 2"+flagdateLocation);


    String creationDate="";
    Date date = model.getTimestamp();
    if (date != null) {
        DateFormat dateFormat = SimpleDateFormat.getDateInstance(DateFormat.FULL, Locale.US);
        creationDate = dateFormat.format(date);
        Log.d("TAG", creationDate);
    }
     holder.textViewTodayDate.setText(creationDate);

}

OnCreateViewSer:

Dodałem, że warunek sprawdzenia flagi, który został zadeklarowany na OnbindViewerSperient w zależności od tych pól będących null, czy nie, aby zdecydować się na żądany obraz Cardview.

public AnnounceHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View V;
   if (flagdateLocation == false) {
       V = LayoutInflater.from(parent.getContext()).inflate(R.layout.announcements_card_view_without_l_s, parent, false);
   }
   else{
       V = LayoutInflater.from(parent.getContext()).inflate(R.layout.announcements_card_view, parent, false);
    }


    return new AnnounceHolder(V);
}

Struktura FireBase:

Cloud Firestore, w którym pola są aktualizowane w zależności od ogłaszania administratora

Problem polega na tym, że pola są null, recyklerygiew zawsze pokazuje ten sam cardview. Stan, jeśli w jakiś sposób nie działa. Moje pytanie brzmi: jest to, że moje podejście do wymogu jest prawidłowe lub konieczne jest inny sposób. Gdzie poszedłem źle?

Całkowity Recylerydapter:

public class AnnouncementsAdapter extends FirestoreRecyclerAdapter<Announcements, AnnouncementsAdapter.AnnounceHolder> {

boolean flagdateLocation;

public AnnouncementsAdapter(@NonNull FirestoreRecyclerOptions<Announcements> options) {
    super(options);
}

@Override
protected void onBindViewHolder(@NonNull AnnounceHolder holder, int position, @NonNull Announcements model) {
     holder.textViewTitle.setText(model.getTitle());
     holder.textViewDesc.setText(model.getDescription());
    Log.d(TAG, "onBindViewHolder: "+model.getLocation()+" "+model.getDate());
     if (model.getDate()!=null&&model.getLocation()!=null){
         flagdateLocation = true;
         holder.textViewLocation.setText(model.getLocation());
         holder.textViewDate.setText(model.getDate());

     }
     else{
         flagdateLocation = false;
     }

    Log.d(TAG, "onBindViewHolder: 2"+flagdateLocation);


    String creationDate="";
    Date date = model.getTimestamp();
    if (date != null) {
        DateFormat dateFormat = SimpleDateFormat.getDateInstance(DateFormat.FULL, Locale.US);
        creationDate = dateFormat.format(date);
        Log.d("TAG", creationDate);
    }
     holder.textViewTodayDate.setText(creationDate);

}

@NonNull
@Override
public AnnounceHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View V;
   if (flagdateLocation == false) {
       V = LayoutInflater.from(parent.getContext()).inflate(R.layout.announcements_card_view_without_l_s, parent, false);
   }
   else{
      V = LayoutInflater.from(parent.getContext()).inflate(R.layout.announcements_card_view, parent, false);
    }

    V = LayoutInflater.from(parent.getContext()).inflate(R.layout.announcements_card_view, parent, false);


    return new AnnounceHolder(V);
}


class AnnounceHolder extends RecyclerView.ViewHolder{
    TextView textViewTitle;
    TextView textViewDesc;
    TextView textViewLocation;
    TextView textViewDate;
    TextView textViewTodayDate;
    public AnnounceHolder(@NonNull View itemView) {
        super(itemView);
        textViewTitle = itemView.findViewById(R.id.title_announcements);
        textViewDesc = itemView.findViewById(R.id.description_announcements);
        textViewLocation = itemView.findViewById(R.id.location_announcemets);
        textViewDate = itemView.findViewById(R.id.date_announcements);
        textViewTodayDate = itemView.findViewById(R.id.todays_date);

    }
}
1
Uday Kiran 21 listopad 2020, 18:07

1 odpowiedź

Najlepsza odpowiedź

Mam nadzieję, że to pomoże:

public AnnounceHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View V;

    V = LayoutInflater.from(parent.getContext()).inflate(R.layout.announcements_card_view, parent, false);

    return new AnnounceHolder(V);
}

I:

protected void onBindViewHolder(@NonNull AnnounceHolder holder, int position, @NonNull Announcements model) {
 holder.textViewTitle.setText(model.getTitle());
 holder.textViewDesc.setText(model.getDescription());
Log.d(TAG, "onBindViewHolder: "+model.getLocation()+" "+model.getDate());
 if (model.getDate()!=null&&model.getLocation()!=null){
     
     //SET THE VIEWS YOU WANNA SEE TO VISIBLE
     holder.YOUR_DATE_FILED.setVisibility(View.VISIBLE);
     holder.YOUR_LOCATION_FILED.setVisibility(View.VISIBLE)

     holder.textViewLocation.setText(model.getLocation());
     holder.textViewDate.setText(model.getDate());

 }
 else{
     //SET THE VIEWS YOU DON'T WANNA SEE TO GONE
     holder.YOUR_DATE_FILED.setVisibility(View.GONE);
     holder.YOUR_LOCATION_FILED.setVisibility(View.GONE)
     
 }

Log.d(TAG, "onBindViewHolder: 2"+flagdateLocation);


String creationDate="";
Date date = model.getTimestamp();
if (date != null) {
    DateFormat dateFormat = SimpleDateFormat.getDateInstance(DateFormat.FULL, Locale.US);
    creationDate = dateFormat.format(date);
    Log.d("TAG", creationDate);
}
 holder.textViewTodayDate.setText(creationDate);

}
2
Mehran B 21 listopad 2020, 16:11