Java 在Firebase数据库查询中重复自身的图像

Java 在Firebase数据库查询中重复自身的图像,java,android,firebase-realtime-database,Java,Android,Firebase Realtime Database,在我的CardStackFragment.java中,我有一个从Firebase实时数据库中检索5个随机图像的查询。 这是我用来检索它们的代码: final DatabaseReference countriesRef = mDatabase.child("paises"); final ValueEventListener valueEventListener = new ValueEventListener() { @Override publ

在我的
CardStackFragment.java
中,我有一个从Firebase实时数据库中检索5个随机图像的查询。 这是我用来检索它们的代码:

final DatabaseReference countriesRef = mDatabase.child("paises");
    final ValueEventListener valueEventListener = new ValueEventListener()
    {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot)
        {
            countriesRef.removeEventListener(this);
            List<String> urlList = new ArrayList<>();
            List<String> nomePaisList = new ArrayList<>();
            for(DataSnapshot ds : dataSnapshot.getChildren())
            {
                String url = ds.child("Imagem").getValue(String.class); 
                String nomePais = ds.child("Nome").getValue(String.class); 
                urlList.add(url); // Adiciona as imagens à lista
                nomePaisList.add(nomePais); // Adiciona os nomes à lista
            }

            int urlCount = urlList.size();

            int randomNumber = new Random().nextInt(urlCount);

            final List<String> randomUrlList = new ArrayList<>(); 
            final List<String> randomNomePaisList = new ArrayList<>(); 


            for (int i=0; i<=Constants.TOTAL_PAISES; i++)
            {
                randomUrlList.add(urlList.get(randomNumber)); 
                randomNomePaisList.add(nomePaisList.get(randomNumber)); 

                    Picasso.with(getContext()).load(randomUrlList.get(i)).into(imgFotoPais); 
                txtPaisNome.setText(randomNomePaisList.get(i)); 
                final int temp_i = i;
 imgFotoPais.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());
                        SharedPreferences.Editor editor;
                        editor = getActivity().getSharedPreferences("FotoPaisCardParaInfo", MODE_PRIVATE).edit();
                        editor.putString("fotoPaisCard", randomUrlList.get(temp_i));
                        editor.putString("nomePaisCard",randomNomePaisList.get(temp_i));
                        editor.commit();


                        Intent intentIntro = new Intent(getActivity(), CountryInfoActivity.class); // Cria o intent "intentIntro"
                        startActivity(intentIntro); // Inicia a atividade IntroActivity
                        getActivity().overridePendingTransition(R.anim.slide_up_info, R.anim.nothing);
                    }
                });
这是我的日志猫

这是我的适配器

类CardStackAdapter扩展FragmentStatePagerAdapter{

public CardStackAdapter(FragmentManager fm){
    super(fm);
}

@Override
public Fragment getItem(int position) { return new CardStackFragment(); }

@Override
public int getCount() { return 5; }

}

在向其输入数据之前检查列表,如:

if(!urlList.contains(url)){
    urlList.add(url); // Adiciona as imagens à lista
    nomePaisList.add(nomePais); // Adiciona os nomes à lista
}
希望对您有所帮助

//model class=>照片
    //model class => photos
    public class Photos{

       private String Imagem;
       private Stirng Nome;

       //now make constructors
       //and getters and setters

    }

    //now in your CardStackFragment.java change the data initialization method to this

    //init arraylist outside
    private ArrayList<Photos> photosArray;

    //now that's how you have to fetch data
    DatabaseReference countriesRef = mDatabase.child("paises");
    countriesRef .addValueEventListener(new ValueEventListener() {
       @Override
       public void onDataChange(DataSnapshot dataSnapShot) {
          for(DataSnapshot ds : dataSnapshot.getChildren()){
             Photos mPhotos = ds.getValue(Photos.class);
             //check if the value already exist in the array
             if(!photosArray.contains(mPhotos)){
                 photosArray.add(mPhotos);
             }
          }
          //now let's render the data in the views
          //array of images to be used
          ArrayList<Photos> toBeUsed = new ArrayList();
          for (int i=0; i<=Constants.TOTAL_PAISES; i++){
                //now check if the image is already added to the array of to be used images
                if(!toBeUsed.contains(photosArray.get(randomNumber))){
                   toBeUsed.add(mPhotos);
                }
                Picasso.with(getContext()).load(toBeUsed.get(i).getImagem).into(imgFotoPais); 
                txtPaisNome.setText(toBeUsed.get(i).getNome);
          }
       }
       @Override
       public void onCancelled(DatabaseError databaseError) {
          //log the error
          Log.e("error in data fetching", databaseError.toString());
       }
    });



//now if you dont want to change your code
//then all you are required to check if the url has been added to randomUrlList
//so before adding the url and name do something like this

//your code

randomUrlList.add(urlList.get(randomNumber)); 
randomNomePaisList.add(nomePaisList.get(randomNumber));

//change it to

if(!randomUrlList.contains(urlList.get(randomNumber))){
   randomUrlList.add(urlList.get(randomNumber)); 
   randomNomePaisList.add(nomePaisList.get(randomNumber));
}


//thats it
//this time it's gonig to work for sure
公开课照片{ 私有字符串图像; 私人斯蒂恩诺姆; //现在创建构造函数 //以及能手和二传手 } //现在在CardStackFragment.java中,将数据初始化方法更改为 //init arraylist外部 私有数组列表; //现在,这就是获取数据的方式 DatabaseReference countriesRef=mDatabase.child(“paises”); countriesRef.addValueEventListener(新的ValueEventListener(){ @凌驾 公共void onDataChange(DataSnapshot DataSnapshot){ 对于(DataSnapshot ds:DataSnapshot.getChildren()){ Photos mPhotos=ds.getValue(Photos.class); //检查数组中是否已存在该值 如果(!photosArray.contains(mPhotos)){ photosArray.add(mPhotos); } } //现在,让我们在视图中渲染数据 //要使用的图像数组 ArrayList toBeUsed=新的ArrayList();
对于(int i=0;我仍然得到不同的图像啊哈,没有帮助哦,兄弟,你为什么要制作两个不同的arraylist最好使用一个模型类并制作该模型的arraylist它会优化并减少代码我可以这样做,但我是android新手,我不知道如何制作我看看我目前的答案嗯,我做了你提到的ift和我仍然得到重复的图像。上次我告诉你做其他事情。这次你必须在向随机数组列表添加数据之前检查它。仔细查看答案的第二部分//你的代码randomUrlList.add(urlList.get(randomNumber));randomNomePaisList.add(nomePaisList.get(randomNumber));//将其更改为if(!randomUrlList.contains(urlList.get(randomNumber)){randomUrlList.add(urlList.get(randomNumber));randomNomePaisList.add(nomePaisList.get(randomNumber));}是的,我知道,我用第二部分更改了它,但它仍然显示重复的图像;)它给我这个错误:java.lang.IndexOutOfBoundsException:索引:1,大小:1
    //model class => photos
    public class Photos{

       private String Imagem;
       private Stirng Nome;

       //now make constructors
       //and getters and setters

    }

    //now in your CardStackFragment.java change the data initialization method to this

    //init arraylist outside
    private ArrayList<Photos> photosArray;

    //now that's how you have to fetch data
    DatabaseReference countriesRef = mDatabase.child("paises");
    countriesRef .addValueEventListener(new ValueEventListener() {
       @Override
       public void onDataChange(DataSnapshot dataSnapShot) {
          for(DataSnapshot ds : dataSnapshot.getChildren()){
             Photos mPhotos = ds.getValue(Photos.class);
             //check if the value already exist in the array
             if(!photosArray.contains(mPhotos)){
                 photosArray.add(mPhotos);
             }
          }
          //now let's render the data in the views
          //array of images to be used
          ArrayList<Photos> toBeUsed = new ArrayList();
          for (int i=0; i<=Constants.TOTAL_PAISES; i++){
                //now check if the image is already added to the array of to be used images
                if(!toBeUsed.contains(photosArray.get(randomNumber))){
                   toBeUsed.add(mPhotos);
                }
                Picasso.with(getContext()).load(toBeUsed.get(i).getImagem).into(imgFotoPais); 
                txtPaisNome.setText(toBeUsed.get(i).getNome);
          }
       }
       @Override
       public void onCancelled(DatabaseError databaseError) {
          //log the error
          Log.e("error in data fetching", databaseError.toString());
       }
    });



//now if you dont want to change your code
//then all you are required to check if the url has been added to randomUrlList
//so before adding the url and name do something like this

//your code

randomUrlList.add(urlList.get(randomNumber)); 
randomNomePaisList.add(nomePaisList.get(randomNumber));

//change it to

if(!randomUrlList.contains(urlList.get(randomNumber))){
   randomUrlList.add(urlList.get(randomNumber)); 
   randomNomePaisList.add(nomePaisList.get(randomNumber));
}


//thats it
//this time it's gonig to work for sure