在我的MainActivity.java
我有一个名为HomeFragment.java
的片段,在其中,我有一个名为CardStackFragment.java
的片段。基本上,在我的HomeFragment
中,我会显示应用的标题及其口号。
在CardStackFragment
内,我会显示5张不同国家/地区图片及其名称的卡片。
HomeFragment的GIF:
这是我用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将始终存储最后一个图像(最后一个循环),因此,即使我点击第一张国家卡,我在其他活动中获得的是最后一张国家卡图片。
如何设置仅在共享首选项中保存我单击的图像的字符串?
答案 0 :(得分:0)
您的问题是您将值存储在for循环中,并且下一个循环周期会立即覆盖它,直到您达到最大i
。
要解决此问题,请将存储代码放在onClickListener中,以使其仅在必要时发生。正如您所指出的,这需要一个最终变量,您不能将循环变量i
表示为final
。想到的最简单的解决方案是添加
final int temp_i = i;
在循环中,在onClickListener之前,将值存储到onClickListener中。