RecyclerView не показывает данные из Firebase database

121
01 сентября 2019, 00:10

Уже попробовал разные способы подключения Firebase database к RecyclerView, но каждый раз при запуске приложения он отказывается показывать картинки из хранилища. И при этом нет никаких ошибок, просто открывается пустой Activity. Как справится с этой проблемой? Структура данных в Firebase database (картинки передаются из Firebase storage)

Код activity

public class SimpleActivity extends AppCompatActivity {
private ArrayList<GalleryGridObject> galleryList = new ArrayList<>();
private RecyclerView recyclerView;
private DatabaseReference mRef;
private FirebaseDatabase database;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_simple);
    recyclerView = findViewById(R.id.my_recycler_view);
    recyclerView.setHasFixedSize(true);

    database = FirebaseDatabase.getInstance();
    //mRef = mFirebaseDatabase.getReference().child("Data");
    mRef = database.getReference("Data");
    FirebaseRecyclerOptions<GalleryGridObject> options =
            new FirebaseRecyclerOptions.Builder<GalleryGridObject>()
                    .setQuery(mRef, GalleryGridObject.class)
                    .build();
    FirebaseRecyclerAdapter<GalleryGridObject, ViewHolder> firebaseRecyclerAdapter =
            new FirebaseRecyclerAdapter<GalleryGridObject, ViewHolder>(options) {
                @Override
                protected void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull GalleryGridObject model) {
                    Picasso.get().load(model.getImage()).into(holder.imageGallery);
                }
                @NonNull
                @Override
                public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
                    View itemView = LayoutInflater.from(viewGroup.getContext())
                            .inflate(R.layout.item_coupons, viewGroup, false);
                    return new ViewHolder(itemView);
                }
            };
    LinearLayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(layoutManager);
    firebaseRecyclerAdapter.startListening();
    recyclerView.setAdapter(firebaseRecyclerAdapter);
}
}

Модель для RecyclerView GalleryGridObject

@IgnoreExtraProperties

public class GalleryGridObject {

String image;
public GalleryGridObject () {
    // Default constructor required for calls to DataSnapshot.getValue(User.class)
}
public GalleryGridObject(String image) {
    this.image = image;
}
public String getImage() {
    return image;
}
public void setImage(String image) {
    this.image = image;
}
}

ViewHolder для RecyclerView

public class ViewHolder extends RecyclerView.ViewHolder {
public ImageView imageGallery;
public ViewHolder(@NonNull View itemView) {
    super(itemView);
    imageGallery = itemView.findViewById(R.id.coupons_picture);
}
}
Answer 1

Ну вот смотрю на ваш код и возникает вопрос.

Вот здесь вы создали массив(List), но вы не добавляете нигде в коде, данные в этот массив. А затем вы хотите получить данные от этого пустого массива.

Качестве ответа могу показать пример:

    private List<String> list_img = new ArrayList<String>();
    private DatabaseReference mRef;
    private FirebaseDatabase database;
    database = FirebaseDatabase.getInstance();
    myRef = database.getReference();
    myRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot ds : dataSnapshot.child("Data").getChildren()){
                list_img.add(String.valueOf(dataSnapshot.child("Data").child(ds.getKey()).getValue()));
            }
        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
        }
    });
Answer 2

Надо изменить private ArrayList<GalleryGridObject> galleryList = new ArrayList<>(); на private List<GalleryGridObject> galleryList; В итоге код фрагмента (или активити) должен получиться таким

public class TestFragment extends Fragment {
private List<GalleryGridObject> galleryList;
private TestAdapter mAdapter;
private RecyclerView recyclerView;
private DatabaseReference mRef;
private FirebaseDatabase database;
public TestFragment() {
    // Required empty public constructor
}

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_coupons, container, false);
    recyclerView = view.findViewById(R.id.my_recycler_view);
    recyclerView.setHasFixedSize(true);
    LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(layoutManager);
    galleryList = new ArrayList<>();
    mAdapter = new TestAdapter(galleryList);
    database = FirebaseDatabase.getInstance();
    //mRef = database.getReference().child("Data");
    mRef = database.getReference("Data");
    mRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
            GalleryGridObject image = dataSnapshot.getValue(GalleryGridObject.class);
            galleryList.add(image);
            recyclerView.setAdapter(mAdapter);
        }
        @Override
        public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
        }
        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
        }
        @Override
        public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
        }
    });
    return view;
}
public class TestAdapter extends RecyclerView.Adapter<TestAdapter.ViewHolder>{
    private Context mContext;
    private List<GalleryGridObject> galleryArrayList;
    public TestAdapter( List<GalleryGridObject> galleryArrayList){
        //this.mContext=mContext;
        this.galleryArrayList=galleryArrayList;
    }
    @NonNull
    @Override
    public TestAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_coupons, parent, false);
        return new TestAdapter.ViewHolder(itemView);
    }
    @Override
    public void onBindViewHolder(@NonNull TestAdapter.ViewHolder holder, int position) {
        //GalleryGridObject gallery = galleryArrayList.get(position);
        //Glide.with(mContext).load(galleryArrayList.get(position).getImage()).into(holder.imageGallery);
        holder.textView.setText(galleryArrayList.get(position).getTitle());
        Picasso.get().load(galleryArrayList.get(position).getImage()).into(holder.imageGallery);
    }
    @Override
    public int getItemCount() {
        if(galleryArrayList==null) return 0;
        return galleryArrayList.size();
    }
    public class ViewHolder extends RecyclerView.ViewHolder {
        public ImageView imageGallery;
        public TextView textView;
        public ViewHolder(View view) {
            super(view);
            imageGallery = itemView.findViewById(R.id.coupons_picture);
            textView = itemView.findViewById(R.id.coupons_title);
        }
    }
}
}

Вот модель для RecyclerView (обязательно нужен пустой конструктор)

@IgnoreExtraProperties
public class GalleryGridObject {
String title, image;
public GalleryGridObject () {
    // Default constructor required for calls to DataSnapshot.getValue(User.class)
}
public GalleryGridObject(String title, String image) {
    this.title = title;
    this.image = image;
}
public String getTitle() {
    return title;
}
public void setTitle(String title) {
    this.title = title;
}
public String getImage() {
    return image;
}
public void setImage(String image) {
    this.image = image;
}
}
READ ALSO
PostgreSQL: как вставить переменную в команду restart sequence?

PostgreSQL: как вставить переменную в команду restart sequence?

Есть команда сброса последовательности к заданному числу

144
Ошибка во время выполнения программы

Ошибка во время выполнения программы

Как это можно исправить?

103
Не работает кодировка UTF-8 hibernate + tomcat + Spring MVC + Freemarker

Не работает кодировка UTF-8 hibernate + tomcat + Spring MVC + Freemarker

Всем привет, имею дело с небольшим приложением на Spring MVC, проблема следующая: при отправке данных в БД вместо русских символов там такая абракадабра

130
Оптимизировать CSS код

Оптимизировать CSS код

Есть более 2000 тысстрок такого кода:

104