是否可以在RecyclerView的ViewHolder中获取视图的位置?

时间:2018-09-12 17:20:10

标签: android android-recyclerview recycler-adapter android-viewholder

我拥有的ViewHolder包含我的RecycleView的每个项目所需的视图,这是两个TextViews,PlayPauseView和AppCompatSeekBar。在构造函数中,我已经将它们初始化为布局的ID,并准备好让我的Adapter类扩展它。问题是我有这个PlayPauseView,需要在正确的位置切换才能正常运行,因为如果我在另一个位置按视图,则仍会切换前一个位置。这是一张更好理解的图片。

enter image description here

黄色表示当前正在播放,但是两个不能同时播放,所以我希望在RecyclerView项目中获取视图的位置。

这是来自Holder类

TextView mInstrumentalName, mProducer;
PlayPauseView mPlayButton; // Need to add pause/stop
AppCompatSeekBar mMusicSeekbar;

ItemClickListener itemClickListener;

public TrackHolder(View itemView) {
    super(itemView);

    mInstrumentalName = (TextView) itemView.findViewById(R.id.instrumental_name);
    mProducer = (TextView) itemView.findViewById(R.id.producer);
    mPlayButton = (PlayPauseView) itemView.findViewById(R.id.play_pause);
    mMusicSeekbar = (AppCompatSeekBar) itemView.findViewById(R.id.music_seekbar);



    itemView.setOnClickListener(this);
}

这是来自Adapter类

@Override
public void onBindViewHolder(@NonNull final TrackHolder holder, final int position) {
    holder.mInstrumentalName.setText(tracks.get(position).getInstrumentalName());
    holder.mProducer.setText(tracks.get(position).getProducer());


    holder.mPlayButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            holder.mPlayButton.toggle();
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            if (mediaPlayer.isPlaying()) {

                mediaPlayer.reset();
                try {
                    mediaPlayer.setDataSource(tracks.get(position).getMusicLink());
                } catch (IOException e) {
                    e.printStackTrace();
                }
                mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mediaPlayer) {
                        mediaPlayer.start();
                    }
                });
                mediaPlayer.prepareAsync();

            } else {
                try {
                    mediaPlayer.setDataSource(tracks.get(position).getMusicLink());
                    previous_link = tracks.get(position).getMusicLink();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mediaPlayer) {
                        mediaPlayer.start();
                    }
                });
                mediaPlayer.prepareAsync();
            }


        }
    });

    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mediaPlayer) {
            mediaPlayer.release();
        }
    });

    holder.setItemClickListener(new ItemClickListener() {
        @Override
        public void onItemClick(View v, int pos) {
            Toast.makeText(context, Integer.toString(tracks.size()), Toast.LENGTH_SHORT).show();
        }
    });
}

2 个答案:

答案 0 :(得分:0)

如果您想在视图持有者课程中获得位置,则可以在课程内部致电PermissionSet。这将返回您在视图持有人类别中的点击位置

答案 1 :(得分:0)

我终于找到了解决方案。因此,我不是着眼于ViewHolder内部的视图,而是刷新/更新了RecyclerView中的整个项目,这意味着它将刷新上一个项目的切换状态。如果将来有人在同一个问题上遇到任何麻烦,这是一段代码。

            private int start_notifying = 0;
            private int previous_pos = -1;

因此开始通知的位置为0,因为您不希望刷新该项目,直到您至少一次切换了播放按钮,然后在要按其他列表项时将当前位置设置为上一个位置。然后增加,以便可以在按下的下一个项目上刷新项目。使用notifyItemChanged(previous_pos)刷新所按下的上一个位置的项目,使播放按钮恢复到其正常状态。

            if (start_notifying > 0) {
                notifyItemChanged(previous_pos);
                previous_pos = position;
            } else {
                previous_pos = holder.getAdapterPosition();
                Log.d("previous_pos", Integer.toString(holder.getAdapterPosition()));
                start_notifying++;
            }