从for循环

时间:2018-06-08 14:50:52

标签: java android

在我的MainActivity.java我有一个名为HomeFragment.java的片段,在其中,我有一个名为CardStackFragment.java的片段。基本上,在我的HomeFragment中,我会显示应用的标题及其口号。

CardStackFragment内,我会显示5张不同国家/地区图片及其名称的卡片。

HomeFragment的GIF:

Click here to see a gif of my HomeFragment

这是我用CardStackFragment中的Firebase实时数据库检索图片及其各自名称的代码:

mDatabase = FirebaseDatabase.getInstance().getReference();
    // Carrega o nó "paises" da Base de Dados //

    DatabaseReference countriesRef = mDatabase.child("paises");
    ValueEventListener valueEventListener = new ValueEventListener()
    {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot)
        {
            List<String> urlList = new ArrayList<>();
            List<String> nomePaisList = new ArrayList<>();

            // Carrega o nome e a imagem de todos os países para as listas urlList e nomePaisList//
            for(DataSnapshot ds : dataSnapshot.getChildren())
            {
                String url = ds.child("Imagem").getValue(String.class); // Carrega as imagens
                String nomePais = ds.child("Nome").getValue(String.class); // Carrega os nomes
                urlList.add(url); // Adiciona as imagens à lista
                nomePaisList.add(nomePais); // Adiciona os nomes à lista
            }
            // A variável recebe a quantidade de paises que foram carregados //
            int urlCount = urlList.size();
            // A variável recebe um número random do total de países //
            int randomNumber = new Random().nextInt(urlCount);
            // Declara as listas random //
            List<String> randomUrlList = new ArrayList<>(); // Lista da imagem random
            List<String> randomNomePaisList = new ArrayList<>(); // Lista do nome random
            // Ciclo que vai do 0 até ao total de países //
            for (int i=0; i<=Constants.TOTAL_PAISES; i++)
            {
                randomUrlList.add(urlList.get(randomNumber)); // Guarda um valor ao calhas de um país
                randomNomePaisList.add(nomePaisList.get(randomNumber)); // Guarda o nome referente à imagem que foi sorteada





Picasso.with(getContext()).load(randomUrlList.get(i)).into(imgFotoPais); 
txtPaisNome.setText(randomNomePaisList.get(i));

imgFotoPais.setOnClickListener(new View.OnClickListener() {
  @Override
   public void onClick(View view) {
     Intent intentIntro = new Intent(getActivity(), 
     CountryInfoActivity.class); 
     startActivity(intentIntro); 

     getActivity().overridePendingTransition(R.anim.slide_up_info, R.anim.nothing);
                    }
                });

            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {}

此代码完美无缺。它让我随机了解各国及其相关名称...... 我想要实现的是,当我点击一张特定的卡片时,我会被重定向到一个新的活动CountryCardInfo.java,其中的ImageView的大小为os活动,其中包含我选择的相应国家/地区的照片...我的第一个ideia是存储在SharedPreferences中的图像字符串(在我发布的代码中检索)

SharedPreferences sp = 
PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
                        SharedPreferences.Editor editor;
                        editor = getSharedPreferences("CardPhotoInfo", MODE_PRIVATE).edit();

editor.putString("photoCountryInfo", randomUrlList.get(i);

然后,在我的CountryCardInfo.java中检索该String并使用Picasso.with(this).load(imagemPais).fit().into(imgCountryInfoFoto);将其放入我的ImageView中。问题是,SharedPreferences将始终存储最后一个图像(最后一个循环),因此,即使我点击第一张国家卡,我在其他活动中获得的是最后一张国家卡图片。

如何设置仅在共享首选项中保存我单击的图像的字符串?

1 个答案:

答案 0 :(得分:0)

您的问题是您将值存储在for循环中,并且下一个循环周期会立即覆盖它,直到您达到最大i

要解决此问题,请将存储代码放在onClickListener中,以使其仅在必要时发生。正如您所指出的,这需要一个最终变量,您不能将循环变量i表示为final。想到的最简单的解决方案是添加

final int temp_i = i;

在循环中,在onClickListener之前,将值存储到onClickListener中。