Firebase Recyclerview Retrieve - PullRequest
       13

Firebase Recyclerview Retrieve

1 голос
/ 01 октября 2019

Я не могу получить файлы из моего рециркулятора. Вот мой код

ошибки в прогоне нет.

public class RetrieveActivity extends AppCompatActivity {


    RecyclerView rView;
    private GridViewAdapter gridViewAdapter;
    DatabaseReference databaseReference;
    List<uploadPDF> uploadPDFS;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_retrieve);

    rView = (RecyclerView) findViewById(R.id.recycler_View);

    databaseReference = FirebaseDatabase.getInstance().getReference("uploads");

    uploadPDFS = new ArrayList<>();
    gridViewAdapter = new GridViewAdapter(this, uploadPDFS);

    RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(this, 2);
    rView.setLayoutManager(mLayoutManager);
    rView.addItemDecoration(new GridSpacingItemDecoration(2, dpToPx(10), true));
    rView.setItemAnimator(new DefaultItemAnimator());
    rView.setAdapter(gridViewAdapter);

    prepareView();


    }


  public void prepareView(){

        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if(dataSnapshot.exists()){
                   for(DataSnapshot is : dataSnapshot.getChildren()){
                        Map<String, String> map = (Map) is.getValue();
                        String name = map.get("name");
                        String author = map.get("author");
                        String imageUrl = map.get("imageUrl");
                        String url = map.get("url"); 
                        uploadPDF uploadPDF = new uploadPDF(name, author, imageUrl,  url);
                        uploadPDFS.add(uploadPDF);
}


                }

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
        gridViewAdapter.notifyDataSetChanged();
    }

введите описание изображения здесь

1 Ответ

1 голос
/ 01 октября 2019

Вы вызываете notifyDataSetChanged до фактической загрузки данных.

В вашем onCreate вы создаете адаптер, связываете его с вашим представлением и даете ему (изначально пустой) массив для рендеринга. ,В этот момент Android сделает именно это: отобразит вид сетки без элементов.

Затем в prepareView вы начнете загружать данные и сразу же вызовете notifyDataSetChanged, который перерисовывает сетку с пустым массивом,так как данные еще не загружены. Затем, как только эти данные возвращаются, вы помещаете их в массив. Но так как вы никогда не сообщаете Android о новых данных, он никогда не перерисовывает представление с новыми данными.

databaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        uploadPDFS.clear();
        if(dataSnapshot.exists()){
           for(DataSnapshot is : dataSnapshot.getChildren()){
                Map<String, String> map = (Map) is.getValue();
                String name = map.get("name");
                String author = map.get("author");
                String imageUrl = map.get("imageUrl");
                String url = map.get("url"); 
                uploadPDF uploadPDF = new uploadPDF(name, author, imageUrl,  url);
                uploadPDFS.add(uploadPDF);
           }
        }
        gridViewAdapter.notifyDataSetChanged();
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException();
    }
});

Я также:

  • Добавлен вызов uploadPDFS.clear(). В противном случае вы получите две копии каждого PDF-файла, если в базовых данных есть какие-либо изменения. Попробуйте, и вы поймете, что я имею в виду.
  • Добавлен throw databaseError.toException() в onCancelled, потому что игнорировать возможную ошибку - плохая идея.

Также смотрите:

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