Как перебирать данные в LinkedHashMap по щелчку

#android

#Android

Вопрос:

Я пытаюсь отобразить некоторые изображения, а также связанный текст, но, похоже, не могу понять, как правильно циклически просматривать их с помощью события ImageButton onclick. Все, что я хотел бы сделать, это переходить к следующему изображению при каждом нажатии кнопки. Как только я дойду до конца, просто начните сначала.

Вот мой код. Это, вероятно, не самое элегантное, но, похоже, работает, за исключением того, что «currentid» каким-то образом меняется, поэтому я никогда не нахожу текущее изображение в цикле foreach.

 public class Fundamentals extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_fundamentals);

    //Ojbects for forward and back buttons
    ImageButton forwardButton = (ImageButton) findViewById(R.id.forward_button);

    //image object
    ImageView imageview = (ImageView) findViewById(R.id.fundamentals_image);

    //Object for picture text
    TextView textview = (TextView) findViewById(R.id.fundamentals_text);

    //Images and associated text
    Map<Integer, String> fundamentalPics = new LinkedHashMap<Integer, String>();
    fundamentalPics.put(R.drawable.fund1, "some interesting text");
    fundamentalPics.put(R.drawable.fund2, "more interesting text");
    fundamentalPics.put(R.drawable.fund3, "and more");

    //Set initial image
    Map.Entry<Integer,String> pic = (Map.Entry<Integer, String>) fundamentalPics.entrySet().iterator().next();
    imageview.setImageResource(pic.getKey());
    textview.setText(pic.getValue());

    imageview.setTag(fundamentalPics);
    }

    public void setImage(View v) {
    //Object for picture text
    TextView textview = (TextView) findViewById(R.id.fundamentals_text);

    //Object for picture image
    ImageView imageview = (ImageView) findViewById(R.id.fundamentals_image);


    //get current id
    Integer currentid = imageview.getId();

    Map<Integer, String> fundamentalPics = (LinkedHashMap<Integer, String>) imageview.getTag();

    Boolean foundImage = false;
    for (Map.Entry<Integer, String> pic : fundamentalPics.entrySet())
    {
        if (foundImage.equals(true)) {
            textview.setText(pic.getValue());
            imageview.setImageResource(pic.getKey());
            break;
        }
        //cycle until we find current image
        if (pic.getKey().equals(currentid)) {
            foundImage = true;

            if (!fundamentalPics.entrySet().iterator().hasNext()) {
                //we've reached the end.  go to beginning....
                Map.Entry<Integer,String> item = (Map.Entry<Integer, String>) fundamentalPics.entrySet().toArray()[0];
                textview.setText(item.getValue());
                imageview.setImageResource(item.getKey());
            }
        }
    }
}
  

Комментарии:

1. почему бы вам не сохранить этот объект pic на уровне экземпляра, чтобы вы могли получить доступ с помощью любого метода обратного вызова, вместо того, чтобы получать его из image.getTag. А также вы можете сохранить текущий индекс изображения на уровне экземпляра, это упростит логику. Просто предложение.

Ответ №1:

Я думаю, вы сравниваете неправильно :

 if (pic.getKey().equals(currentid))
  

На вашей карте вы сохранили drawable id, который является идентификатором изображения, поэтому getKey () вернет идентификатор drawable image, а currentid имеет идентификатор imageview, который определен в layout xml для этого imageview (а не идентификатор drawable изображения). Хотя оба являются целыми числами, но учтите разницу, одно из них из R.drawable. * а другое из R.id . *, один — это идентификатор каждого изображения, а другой — идентификатор imageview.

Итак, imageview — это контейнер, в котором будут отображаться изображения, и вы сравниваете идентификатор этого контейнера с идентификаторами изображений, очевидно, что они не будут совпадать.

К сожалению, для imageview нет getDrawableId(). Обходной путь заключается в сравнении с каждым отображаемым идентификатором :

Вы можете получить отрисовываемый вид

 Drawable myDrawable = imageview.getDrawable();
  

Вы можете сравнить его с доступным ресурсом, таким как :

 if(imageview.getDrawable()==getResources().getDrawable(R.drawable.fund1) || imageview.getDrawable()==getResources().getDrawable(R.drawable.fund2) || imageview.getDrawable()==getResources().getDrawable(R.drawable.fund3)){
    //do work here
}
  

Конечно, вы можете использовать лучшие способы сравнения, я просто привел пример. Надеюсь, это поможет!