Невозможно получить базу данных пожарного хранилища, используя recyclerView - PullRequest
0 голосов
/ 13 октября 2018

Я использую recyclerView и Adapter для извлечения данных в profileActivity

, вот мой

public class studentDetailsRecyclerActivity extends AppCompatActivity {
  //recyclerview  to set the details for UI in the student profile activity

    private RecyclerView mRecyclerView;
    private storeDetailsAdapter mStoreDetailsAdapter;

    private List<storeStudentDetails> studentDetailsList;

    private FirebaseFirestore dbReference;

    private ProgressBar mProgressBar;

    private String TAG = studentDetailsRecyclerActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        dbReference = FirebaseFirestore.getInstance();
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycler_details);

        mProgressBar = findViewById(R.id.progressbar);

        mRecyclerView = (RecyclerView)findViewById(R.id.recyclerView_products);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

        studentDetailsList = new ArrayList<>();

        mStoreDetailsAdapter = new storeDetailsAdapter(this,studentDetailsList);

        mRecyclerView.setAdapter(mStoreDetailsAdapter);
        //to get the "details" this is our collection from firestore so we must fetch them
        //by calling the addOnSuccessListener
        dbReference.collection("details").get()
                .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                    @Override
                    public void onSuccess(QuerySnapshot queryDocumentSnapshots) { //we must have to hide the progress bar when the data gets loaded

                        //here queryDocumentsSnapshot will hold all the "details" which is your collection in firestore

                        if(!queryDocumentSnapshots.isEmpty()){

                            //we must have to create empty list so that to store all
                            //details from DocumentsSnapshots
                            List<DocumentSnapshot>  list =  queryDocumentSnapshots.getDocuments();



                            //enhanced for loop because we have to give every index documentSnapShot

                            for(DocumentSnapshot d: list){

                                storeStudentDetails sd = d.toObject(storeStudentDetails.class);
                                studentDetailsList.add(sd);


                                Log.d(TAG, "onSuccess: " + sd.toString());




                            }

                            //to refresh and sync we must have to use notifyDataSetChanged

                            mStoreDetailsAdapter.notifyDataSetChanged();
                        }
                    }
                })  .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(getApplicationContext(), "Error getting data!!!", Toast.LENGTH_LONG).show();
            }
        });
    }
}

, а вот мой storeDetailsAdapter

import java.util.List;

public class storeDetailsAdapter extends RecyclerView.Adapter<storeDetailsAdapter.StudentViewHolder>{

    private Context context;
    private List<storeStudentDetails> studentDetailsList;

    public storeDetailsAdapter(Context context, List<storeStudentDetails> studentDetailsList) {
            this.context = context;
            this.studentDetailsList = studentDetailsList;
    }

    @NonNull
    @Override
    public StudentViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new StudentViewHolder(
                LayoutInflater.from(context).inflate(R.layout.profile_activity, parent, false)
        );
    }



    @Override
    public void onBindViewHolder(@NonNull StudentViewHolder holder, int position) {
        storeStudentDetails mStoreDetails = studentDetailsList.get(position);

        holder.studName.setText(mStoreDetails.getStudentName());
        holder.rollNum.setText(mStoreDetails.getRollNo());
        holder.bookName.setText( mStoreDetails.getBook());
        holder.fine.setText("Fine:" + mStoreDetails.getFine());
        holder.dept.setText(mStoreDetails.getDept());

    }

    @Override
    public int getItemCount() {
        return studentDetailsList.size();
    }

    class StudentViewHolder extends RecyclerView.ViewHolder {

        TextView studName,rollNum,bookName,dept,fine;

        public StudentViewHolder(View itemView) {
            super(itemView);

            studName=itemView.findViewById(R.id.studentName_prof);
            rollNum = itemView.findViewById(R.id.rollNumber_prof);
            bookName = itemView.findViewById(R.id.bookName_prof);
            fine = itemView.findViewById(R.id.fineAmt_prof);
            dept = itemView.findViewById(R.id.department_prof);
        }
    }
}

, а вотмой класс StoreStudentDetails:

public class storeStudentDetails implements Serializable {


    private String studentName;
    private  String rollNo;
    private  String book;
    private Double fine;
    private String dept;

    @Exclude private String id;

    public storeStudentDetails() {
    }

    public storeStudentDetails(String studentName, String rollNo,String book, double fine ,String dept) {

        this.studentName = studentName;
        this.rollNo = rollNo;
        this.book = book;
        this.fine = fine;
        this.dept = dept;


    }

    public void setId(String id) {
        this.id = id;
    }

    public String getStudentName() {
        return studentName;
    }

    public String getRollNo() {
        return rollNo;
    }

    public String getBook() {
        return book;
    }

    public Double getFine() {
        return fine;
    }

    public String getDept() {
        return dept;
    }

    public String getId() {
        return id;
    }
}

1 Ответ

0 голосов
/ 14 октября 2018

Чтобы решить эту проблему, переместите следующие строки кода:

mStoreDetailsAdapter = new storeDetailsAdapter(this,studentDetailsList);
mRecyclerView.setAdapter(mStoreDetailsAdapter);

Прямо перед следующей строкой кода:

mStoreDetailsAdapter.notifyDataSetChanged();

И это потому, что метод onSuccess() имеетасинхронное поведение, и к тому времени, когда вы устанавливаете адаптер за пределами обратного вызова, ваш список пуст.

Как видите, самое простое решение этой проблемы - переместить эти строки кода внутри обратного вызова.но если вы хотите использовать значение вашего studentDetailsList вне метода onSuccess(), я рекомендую вам посмотреть последнюю часть моего ответа из этого поста , в котором я объяснилкак это можно сделать с помощью пользовательского обратного вызова.Вы также можете взглянуть на это видео для лучшего понимания.

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