在自定义适配器中正确显示搜索条

时间:2014-11-14 03:59:33

标签: android

我有一个列表,其中播放器上的每个元素。当我点击“开始”并开始播放歌曲时,条形搜索栏开始移动。当点击“停止”时,歌曲停止播放并且条带停止。但是,如果在移动条带时我滚动列表并且它离开屏幕,则它开始移动另一个位于屏幕可见区域中相同位置的条带。

public class RecordAdapter extends BaseAdapter {
    private MediaPlayer mediaPlayer;
    private LayoutInflater inflater;
    private ArrayList<RecordBean> recordBeans;
    private final Handler handler = new Handler();
    private Context ctx;
    private int global_position;

       ...
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View view = convertView;
        final ViewHolder holder;
        if (convertView == null) {
            view = inflater.inflate(R.layout.recorditem, parent, false);
            holder = new ViewHolder();
            holder.date = (TextView) view.findViewById(R.id.recordate);
            holder.seekBar = (SeekBar) view.findViewById(R.id.seekBar);
            holder.start = (Button) view.findViewById(R.id.btnStart);
            holder.stop = (Button) view.findViewById(R.id.btnStop);

            view.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();
        }
        holder.date.setText(" " + recordBeans.get(position).getDate());
        holder.start.setTag(position);
        holder.stop.setTag(position);
        holder.seekBar.setTag(position);
        holder.seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

            @Override
            public void onProgressChanged(final SeekBar seekBar, final int i, boolean b) {
                if (b && (Integer)seekBar.getTag()==global_position) {
                    mediaPlayer.seekTo(i);
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
            }
        });
        holder.start.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                releaseMP();
                try {
                    mediaPlayer = new MediaPlayer();
                    mediaPlayer.setDataSource(recordBeans.get((Integer) v.getTag()).getFile());
                    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mediaPlayer) {
                            mediaPlayer.start();
                            global_position = position;
                            holder.start.setTextColor(Color.RED);
                            holder.seekBar.setMax(mediaPlayer.getDuration());
                            startPlayProgressUpdater(holder.seekBar,holder.start);
                        }
                    });
                    mediaPlayer.prepareAsync();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if (mediaPlayer == null) {
                    return;
                }
                mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                    @Override
                    public void onCompletion(MediaPlayer mediaPlayer) {
                        Log.d("LOG_TAG", "onCompletion");
                        holder.start.setTextColor(Color.WHITE);
                    }
                });
            }
        });

        holder.stop.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (mediaPlayer == null)
                    return;
                if ((Integer) v.getTag() == global_position) {
                    mediaPlayer.stop();
                }
            }
        });
        return view;
    }

    private void releaseMP() {
        if (mediaPlayer != null) {
            try {
                mediaPlayer.release();
                mediaPlayer = null;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private static class ViewHolder {
        TextView date;
        SeekBar seekBar;
        Button start;
        Button stop;
    }

    public void startPlayProgressUpdater(final SeekBar seek, final Button start) {
        seek.setProgress(mediaPlayer.getCurrentPosition());
        if (mediaPlayer.isPlaying()) {
            Runnable notification = new Runnable() {
                public void run() {
                    startPlayProgressUpdater(seek,start);
                }
            };
            handler.postDelayed(notification, 1000);
        } else {
            mediaPlayer.pause();
            seek.setProgress(0);
        }
    }
}

编辑:

我在recordBean中添加了geter和seter

 public int getSeekPos() {
            return SeekPos;
        }

        public void setSeekPos(int seekPos) {
            SeekPos = seekPos;
        }

holder.seekBar.setProgress(recordBeans.get(position).getSeekPos());
        holder.date.setText(" " + recordBeans.get(position).getDate());

@Override
            public void onProgressChanged(final SeekBar seekBar, final int i, boolean b) {
                if (b && (Integer)seekBar.getTag()==global_position) {
//                    mediaPlayer.seekTo(i);
                    recordBeans.get(position).setSeekPos(i);
                }
            }

但我认为它在我的代码中留下了额外的东西

2 个答案:

答案 0 :(得分:0)

列表项在离开屏幕时正在回收。 您可以尝试在getView中调用它:

holder.seekBar.clearFocus();

答案 1 :(得分:0)

这是一个棘手的过程,但您可以通过以下方式执行此操作,因为我已经看到您已创建了RecordBean类的列表。所以你可以做的是你必须在RecordBean中创建一个Getter Setter来存储你SeekBar的位置,如:

public void setSeekPos(int pos) {
    this.pos = pos;
}

public int getSeekPos() {
    return pos;
}

在你的适配器下面的行
holder.date.setText(" " + recordBeans.get(position).getDate());

像这样设置seekBar的进度:holder.seekBar.setProgress(recordBeans.get(position).getSeekPos());

并在onProgressChanged内添加以下行recordBeans.get(position).setSeekPos(i);

这将解决您的问题。

如果它正常工作,请告诉我。

由于