列表视图中 recycled/convertView 行的重复视图实例问题

duplicate view instance issue with recycled/convertView row in listview

MyAdapter:

public class voice_player_listview_adapter extends ArrayAdapter<String> {
public  ArrayList<String> Duration=null;
public  ArrayList<String> voice_id=null;
private Activity context;
public voice_player_listview_adapter(Activity context,ArrayList<String> voice_id,ArrayList<String> Duration) {
    super(context, R.layout.voice_player_listview,sender);
    // TODO Auto-generated constructor stub
    this.context=context;
    this.voice_id=voice_id;
    this.Duration=Duration;
}
public View getView(final int position, final View convertView, ViewGroup parent) {
    View rowView=convertView;
    final viewHolder holder; //viewHolder already created in some where
    if (rowView==null)
    {
        LayoutInflater inflater = context.getLayoutInflater();
        rowView = inflater.inflate(R.layout.voice_player_listview, parent, false);
        holder= new viewHolder();
        holder.icon=(ImageView) rowView.findViewById(R.id.download_play_icon);
        holder.voice_duration=(TextView) rowView.findViewById(R.id.voiceDuration);
        holder.voice_player_seekbar=(SeekBar) rowView.findViewById(R.id.voice_player_seekbar);
        rowView.setTag(holder);
    }
       else
    {
        holder= (viewHolder) convertView.getTag();
    }
    holder.voice_duration.setText("00:"+this.Duration.get(position));
    holder.icon.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    new voicePlayer(voice_id.get(position),holder);

                }
            });

            ...


VoicePlayer:

class voicePlayer {
 MediaPlayer mediaPlayer;
 SeekBar seekbar;
 TextView voice_duration;
 ImageView icon;
 viewHolder rowView;
 final Handler handler = new Handler();
public void getViews()
{
    this.seekbar=rowView.voice_player_seekbar;
    this.voice_duration=rowView.voice_duration;
    this.icon=rowView.icon;
}
public voicePlayer(String voice_id,WavesAPI.viewHolder holder) {
    this.rowView=holder;
    getViews();
        try {
                mediaPlayer=new MediaPlayer();

                FileInputStream fis  = new FileInputStream(Environment.getExternalStorageDirectory()...);
                mediaPlayer.setDataSource(fis.getFD());
                mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    mediaPlayer.prepare();
                    mediaPlayer.start();
                    this.icon.setImageResource(R.drawable.pause);
                    this.updateSeekbar();
                    this.seekbar_listener();

                } catch (IOException e) {

                }

            } catch (IOException e) {
            }

    }


}
private void updateSeekbar()
{

    final Runnable runnable = new Runnable() {
        public void run() {
            int position= // calculating the position of the mediaPlayer for updating the seekbar
            seekbar.setProgress(position);
            handler.postDelayed(this, 50);
            voice_duration.setText("00:"+((WavesAPI.player_data.mediaPlayer.getDuration()/1000)-(WavesAPI.player_data.mediaPlayer.getCurrentPosition()/1000)));
        }
    };

    handler.post(runnable);
}

public void seekbar_listener()
{
    seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            if (fromUser)
            {
                int player_position=// calc new postion of the mediaPlayer
                mediaPlayer.seekTo(player_position);
            }
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });
}

}


问题: 当我点击列表视图行上的播放 icon 时,只要我不滚动,音乐就会播放并且搜索栏会正确更新.但是,由于 screen/listview 仅适合 3 个项目,当我向下滚动时,每 4 行,我看到新行搜索栏正在更新,其进度与我播放和滚动的旧行相同。我认为 convertView 生成与创建并传递给 voicePlayer 相同的旧实例视图。一旦我不考虑 convertView 并且对于每个 getView 我通过 inflater.inflate 创建新的 rowView ,复制实例问题就解决了但是当我滚动一个项目并重新滚动回项目,更新已停止。

问题已解决。我用 ScrollView 而不是 ListView