【问题标题】:How to iterate through custom ArrayList to move to the next item when a button is clicked单击按钮时如何遍历自定义ArrayList以移动到下一个项目
【发布时间】:2016-07-31 12:46:45
【问题描述】:

我是 android 新手,甚至编程才 3 周 我正在尝试通过显示图片和播放音频来为我的德语课构建一个应用程序。 我现在的问题是,我有一个列表视图,其中显示了一个小图片和一个单词,然后我为此列表视图创建了一个 onItemClickListener,它显示了 Word 类型的项目表单和数组列表(为图像资源和音频资源的构造函数和获取方法以及单词本身的字符串)

无论如何,当项目单击项目列表时,我管理它会打开显示图像和播放按钮的弹出布局。

然后我想添加下一个和上一个按钮来获取下一个图像和音频,而不是关闭弹出窗口并再次单击想要的项目但完全没有运气。

我会尽量贴出最重要的相关代码

public class Lesson1Words extends AppCompatActivity {


private MediaPlayer mMediaPlayer;


private MediaPlayer.OnCompletionListener mCompletionListener = new MediaPlayer.OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mediaPlayer) {
        // Now that the sound file has finished playing, release the media player resources.
        releaseMediaPlayer();

    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.word_list);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    final ArrayList<Word> lessone1Words = new ArrayList<>();

    lessone1Words.add(new Word("vernünftig", R.drawable.vernunftig, R.raw.l01_vernunftig));
    lessone1Words.add(new Word("großzügig", R.drawable.groszugig, R.raw.l01_grosszugig));
    lessone1Words.add(new Word("fair", R.drawable.fair, R.raw.l01_fair));
    lessone1Words.add(new Word("intelligent/klug", R.drawable.intelligent, R.raw.l01_intelligent));
    lessone1Words.add(new Word("frech", R.drawable.frech, R.raw.l01_frech));
    lessone1Words.add(new Word("kreativ", R.drawable.kreaiv, R.raw.l01_kreativ));
    lessone1Words.add(new Word("sparsam", R.drawable.sparsam, R.raw.l01_sparsam));
    lessone1Words.add(new Word("realistisch", R.drawable.realistisch, R.raw.l01_realistisch));
    lessone1Words.add(new Word("hübsch", R.drawable.hubsch, R.raw.l01_hubsch));
    lessone1Words.add(new Word("aufmerksam", R.drawable.aufmerksam, R.raw.l01_aufmerksam));

     final WordAdapter adapter = new WordAdapter(this, lessone1Words, R.color.lesson_color);
     final ListView listView = (ListView) findViewById(R.id.word_list);


    assert listView != null;
    listView.setAdapter(adapter);


    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, final View view, final int position, long l) {

            final Word word = lessone1Words.get(position);

             //open Popup layout for the image but still can't iterate through the arraylist
            LayoutInflater layoutInflater
                    = (LayoutInflater) getBaseContext()
                    .getSystemService(LAYOUT_INFLATER_SERVICE);

            View popupView = layoutInflater.inflate(R.layout.popup, null);


            final PopupWindow popupWindow = new PopupWindow(
                    popupView,
                    AppBarLayout.LayoutParams.WRAP_CONTENT,
                    AppBarLayout.LayoutParams.WRAP_CONTENT);
            // when touch outside the Popup layout it dismiss it
            popupWindow.setFocusable(true);
            popupWindow.setBackgroundDrawable(new BitmapDrawable());
            popupWindow.setOutsideTouchable(true);

            //change image in ImageView of Popup.xml to current image in the array

            final ImageView imageBig = (ImageView) popupView.findViewById(R.id.popimage);

            imageBig.setImageResource(word.getImageResourceId());

               ImageView playSound = (ImageView) popupView.findViewById(R.id.play_image);
            playSound.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    //responsible for the playback of the audio according to the arraylist index
                    releaseMediaPlayer();
                    mMediaPlayer = MediaPlayer.create(Lesson1Words.this, word.getAudioResourceId());
                    mMediaPlayer.setVolume(0.5f, 0.5f);
                    mMediaPlayer.start();
                    mMediaPlayer.setOnCompletionListener(mCompletionListener);

                }
            });
            popupWindow.showAtLocation(listView, Gravity.CENTER, 0, 0);


             ImageView nextImage = (ImageView) popupView.findViewById(R.id.next_image);

            nextImage.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {

            // cant go for the nextimage or audio


                }
            });
        }
    });.
    }
    }

【问题讨论】:

  • 您可以在此处关闭当前弹出窗口,并使用 onItemClickListener 中的位置参数为下一个/上一个项目创建一个新的弹出窗口。
  • 请发布您尝试过的内容,因为这听起来很简单,只需调用 get(position+1) 并设置新图像即可。
  • @lionscribe 我试过这个词 word1 =lessone1Words.get(position+1); imageBig.setImageResource(word1.getImageResourceId());// 但它只用于下一张图像它不会继续
  • 另外,你应该在最后一直调用 showAtLocation (尽管它不应该有区别)。

标签: java android loops arraylist android-arrayadapter


【解决方案1】:

创建弹窗时,设置一个带有位置值的标签

imageBig.setTag(Integer.valueOf(position));

在onClick函数调用中

int pos = imageBig.getTag()+1;
imageBig.setTag(Integer.valueOf(pos));
WordNext = getPosition(position);
...

【讨论】:

  • setTag for the int 位置不幸导致错误 java.lang.NullPointerException
  • 现在我将 setTag 放在弹出窗口显示之后,但位置不能在 onClick 内部使用,导致其最终变量
  • 我将代码更改为隐式使用 Integer.valueOf()。
  • 因此设置为名为 pos 的新变量。我更新了代码。
  • 当它到达最后一个项目并且用户尝试再次点击应用程序崩溃时,它工作得非常感谢另一件事
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2022-08-13
  • 2021-10-08
  • 1970-01-01
  • 2017-10-11
  • 2021-12-18
相关资源
最近更新 更多