Android Java ListView извлекает список из базы данных Firebase, но отображает пустые TextViews и изображения - PullRequest
0 голосов
/ 30 сентября 2018

У меня возникла серьезная проблема. Я могу создать элементы представления списка из базы данных Firebase в реальном времени, но его содержимое пустое. Все текстовые представления и изображения не имеют данных. Я начинаю свой путь в Firebase и начинаю свсе это я следовал этому уроку: https://www.youtube.com/watch?v=jEmq1B1gveM&list=PLk7v1Z2rk4hj6SDHf_YybDeVhUT9MXaj1&index=2

и мне это точно понравилось, но видеоурок показывает рабочий список, в то время как мой список пустых просмотров, это мой код:

Album.java:

package com.emadzedan.michealjacksonnoads.michealjacksonnoads;

public class Album{
private String thumbAndID;
private String albumName;
private String numberOfSongs;
private String albumYear;

public Album() {
}

public Album(String thumbAndID, String albumName, String numberOfSongs, String albumYear) {
    this.thumbAndID = thumbAndID;
    this.albumName = albumName;
    this.numberOfSongs = numberOfSongs;
    this.albumYear = albumYear;
}

public String getThumbAndID() {
    return thumbAndID;
}

public void setThumbAndID(String thumbAndID) {
    this.thumbAndID = thumbAndID;
}

public String getAlbumName() {
    return albumName;
}

public void setAlbumName(String albumName) {
    this.albumName = albumName;
}

public String getNumberOfSongs() {
    return numberOfSongs;
}

public void setNumberOfSongs(String numberOfSongs) {
    this.numberOfSongs = numberOfSongs;
}

public String getAlbumYear() {
    return albumYear;
}

public void setAlbumYear(String albumYear) {
    this.albumYear = albumYear;
}
}

AlbumsListAdapter.Java

package com.emadzedan.michealjacksonnoads.michealjacksonnoads;

import android.content.Context;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

import java.util.List;

public class AlbumsListAdapter extends ArrayAdapter<Album> {
    private Context context;
    private List<Album> albums;

ImageView albumThumb;
TextView albumName;
TextView numberOfSongsText;
TextView numberOfSongs;
TextView albumYear;
TextView hiddenThumbORID;

public AlbumsListAdapter(Context context, List<Album> albums) {
    super(context, R.layout.albums_list_row, albums);
    this.context = context;
    this.albums = albums;
}

@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {

    LayoutInflater inflater =  LayoutInflater.from(context);
    View view = inflater.inflate(R.layout.albums_list_row, null, true);

    Album album = albums.get(position);

    //the new code it is not nessacery to cast fields
    albumThumb = view.findViewById(R.id.albumThumb);
    albumName = view.findViewById(R.id.albumName);
    numberOfSongsText = view.findViewById(R.id.numberOfSongsText);
    numberOfSongs = view.findViewById(R.id.numberOfSongs);
    albumYear = view.findViewById(R.id.albumYear);
    hiddenThumbORID = view.findViewById(R.id.hiddenThumbORID);

    Picasso.with(context).load("http://emadzedan.com/musiclibraryandroid_karaokebeta7/bandsimages/" + album.getThumbAndID() + ".png").into(albumThumb);
    albumName.setText(album.getAlbumName());
    numberOfSongs.setText(album.getNumberOfSongs());
    albumYear.setText(album.getAlbumYear());
    hiddenThumbORID.setText(album.getThumbAndID());


    if (position % 2 == 1) {
        //Second
        view.setBackgroundResource(R.color.colorPrimaryDark2);
        albumThumb.setBackgroundResource(R.color.colorPrimaryDark);
        albumYear.setTextColor(context.getResources().getColor(R.color.colorAccent));
        albumName.setTextColor(context.getResources().getColor(R.color.colorAccent));
        numberOfSongsText.setTextColor(context.getResources().getColor(R.color.colorPrimary));
        numberOfSongs.setTextColor(context.getResources().getColor(R.color.colorPrimary));

    } else {
        //First
        view.setBackgroundResource(R.color.colorPrimaryDark);
        albumThumb.setBackgroundResource(R.color.colorPrimaryDark2);
        albumYear.setTextColor(context.getResources().getColor(R.color.colorAccent));
        albumName.setTextColor(context.getResources().getColor(R.color.colorAccent));
        numberOfSongsText.setTextColor(context.getResources().getColor(R.color.colorPrimary));
        numberOfSongs.setTextColor(context.getResources().getColor(R.color.colorPrimary));
    }

    return view;
}


}

AlbumsContainerFragment.Java

package com.emadzedan.michealjacksonnoads.michealjacksonnoads;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.annotation.NonNull;

import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;

import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

import com.google.firebase.database.ValueEventListener;
import com.squareup.picasso.Picasso;

import java.util.ArrayList;

import java.util.List;
import java.util.Random;

import static android.content.Context.MODE_PRIVATE;

public class AlbumsContainerFragment extends Fragment {
SharedPreferences prefs;

ImageView bandImageImageView;

SongsListFragment songsListFragment;

FirebaseDatabase firebaseDatabase;
DatabaseReference rootReference;

List<Album> albums;
ListView albumsListView;
AlbumsListAdapter adapter;

public AlbumsContainerFragment() {

}


@Override
public View onCreateView(@NonNull LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {

    final View view = inflater.inflate(R.layout.fragment_albums_container, container, false);


    final float scale = getContext().getResources().getDisplayMetrics().density;
    int pixels = (int) (200 * scale + 0.5f);


    prefs = getContext().getSharedPreferences("SelectedItemsPref", MODE_PRIVATE);

    SharedPreferences.Editor editor = getContext().getSharedPreferences("SelectedItemsPref", MODE_PRIVATE).edit();

    int minNumberOfCovers = 1;
    int maxNumberOfCovers = 10;

    Random r = new Random();
    int coverNumberSelected = r.nextInt(maxNumberOfCovers - minNumberOfCovers + 1) + minNumberOfCovers;

    editor.putString("image", prefs.getString("bandname" + coverNumberSelected, "michaeljackson" + coverNumberSelected) + ".jpg");
    editor.putString("id", prefs.getString("bandname", "michaeljackson"));
    editor.apply();

    assert ((AppCompatActivity) getActivity()) != null;
    ((AppCompatActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    bandImageImageView = (ImageView) view.findViewById(R.id.bandImageImageView);
    Picasso.with(getContext()).load("http://emadzedan.com/musiclibraryandroid_karaokebeta7/bandsimages/" + prefs.getString("image", "michaeljackson1.jpg")).into(bandImageImageView);

    firebaseDatabase = FirebaseDatabase.getInstance("");
    rootReference = firebaseDatabase.getReference("album");
    albumsListView = view.findViewById(R.id.albumsListView);
    albums = new ArrayList<Album>();

    songsListFragment = new SongsListFragment();

    //This is only because listview is inside scrollview
    int NumberOfAlbums = 29;
    int RowHeight = 106;
    albumsListView.getLayoutParams().height = Math.round(NumberOfAlbums * convertDpToPixel(RowHeight, getContext()));
    albumsListView.setFocusable(false);
    //===================================================

    return view;
}

public static float convertDpToPixel(float dp, Context context) {
    Resources resources = context.getResources();
    DisplayMetrics metrics = resources.getDisplayMetrics();
    float px = dp * ((float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);
    return px;
}

public static float convertPixelsToDp(float px, Context context) {
    Resources resources = context.getResources();
    DisplayMetrics metrics = resources.getDisplayMetrics();
    float dp = px / ((float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);
    return dp;
}

@Override
public void onStart() {
    super.onStart();

    //Fire base List===================================================
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot albumSnapshot : dataSnapshot.getChildren()) {
                Album album = albumSnapshot.getValue(Album.class);
                albums.add(album);
            }

            adapter = new AlbumsListAdapter(getContext(), albums);
            albumsListView.setAdapter(adapter);

            albumsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    SharedPreferences.Editor editor = getContext().getSharedPreferences("SelectedItemsPref", MODE_PRIVATE).edit();
                    //editor.putString("albumThumb", rootReference.child("album").child("" + position ).toString());
                    //editor.putString("albumName",rootReference.child("album").child("" + position ).orderByChild("name").toString());
                    editor.apply();

                    DrawerBaseActivity.backButtonTextView.setVisibility(View.VISIBLE);
                    DrawerBaseActivity.CurrentFragment = "SongsList";
                    //DrawerBaseActivity.titleTextView.setText(rootReference.child("album").child("" + position ).orderByChild("name").toString());
                    getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.FragmentContainer, songsListFragment).addToBackStack("SongsList").commit();
                }
            });
        }

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

        }
    };

    rootReference.addValueEventListener(valueEventListener);
    //Query query = rootReference.orderByChild("id").equalTo("1");
    //query.addValueEventListener(valueEventListener);
    //End Of Fire base 
List===================================================
}
}

Образец JSON: {"album": {

        "1": {
        "id":"1",
        "year": "1969 (The Jackson 5)",
        "name": "Diana Ross Presents The Jackson 5",
        "numberofsongs": "12"
    },

    "2": {
        "id":"2",
        "year": "1970 (The Jackson 5)",
        "name": "ABC",
        "numberofsongs": "12"
    }
}
}

Я проверил идентификаторы и обычно копирую и вставляю, чтобы не было ошибок при опечатке, и приложение не набраловылетать или показывать ошибки только пустые представления в виде списка, пожалуйста, помогите мне, я работал над ним 2 дня и безрезультатно работает

Ответы [ 2 ]

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

Проблема в вашем коде заключается в том, что имена полей в вашем классе Album отличаются от имен свойств в вашей базе данных.В вашем классе Album есть поле с именем thumbAndID, но в вашей базе данных я вижу его как id, и оно неверно.Имена должны совпадать.Вы можете решить эту проблему двумя способами.

Первый - удалить текущие данные и добавить их снова, используя правильные имена.Таким образом, вы должны иметь для своего идентификатора поля то же имя thumbAndID также в базе данных.Это решение будет работать только в том случае, если вы находитесь на этапе тестирования.

Второй подход, который, на мой взгляд, более элегантен, заключается в использовании annotations.Поскольку я вижу, что вы используете частные поля и общедоступные методы получения, вы должны использовать аннотацию PropertyName только перед объектом получения.Поэтому ваш Album класс должен выглядеть следующим образом:

public class Album{
    private String thumbAndID;
    private String albumName;
    private String numberOfSongs;
    private String albumYear;

    public Album() {}

    public Album(String thumbAndID, String albumName, String numberOfSongs, String albumYear) {
        this.thumbAndID = thumbAndID;
        this.albumName = albumName;
        this.numberOfSongs = numberOfSongs;
        this.albumYear = albumYear;
    }

    @PropertyName("id")
    public String getThumbAndID() {
        return thumbAndID;
    }

    public void setThumbAndID(String thumbAndID) {
        this.thumbAndID = thumbAndID;
    }

    @PropertyName("name")
    public String getAlbumName() {
        return albumName;
    }

    public void setAlbumName(String albumName) {
        this.albumName = albumName;
    }

    @PropertyName("numberofsongs")
    public String getNumberOfSongs() {
        return numberOfSongs;
    }

    public void setNumberOfSongs(String numberOfSongs) {
        this.numberOfSongs = numberOfSongs;
    }

    @PropertyName("year")
    public String getAlbumYear() {
        return albumYear;
    }

    public void setAlbumYear(String albumYear) {
        this.albumYear = albumYear;
    }
}

Если вы собираетесь использовать это решение, вам больше ничего не нужно менять в базе данных.

0 голосов
/ 30 сентября 2018

Ваши имена аргументов конструктора должны совпадать с вашими ключами в базе данных Firebase.Измените конструктор класса Album следующим образом.

public Album(String id, String name, String numberofsongs, String year) {
    this.thumbAndID = id;
    this.albumName = name;
    this.numberOfSongs = numberofsongs;
    this.albumYear = year;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...