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