滚动时更新自定义列表视图失败
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了滚动时更新自定义列表视图失败相关的知识,希望对你有一定的参考价值。
我有一个自定义listView,listView的每个视图项都是一个搜索栏和一个按钮。当用户点击一行listview的按钮时,该项的rowView
被发送到一个类(voicePlayer
)以更新rowView的搜索条。如果我滚动列表视图使视图不可见,则类正确更新搜索栏,停止搜索栏的进度(更新)。听起来像视图的元素在滚动期间获取新地址,旧的无效,即使看不见,我应该如何更新视图的UI?
public View getView(final int position, final View view, ViewGroup parent) {
LayoutInflater inflater=context.getLayoutInflater();
rowView=inflater.inflate(R.layout.voice_player_listview, null,true);
final SeekBar voice_player_seekbar =(SeekBar) rowView.findViewById(R.id.voice_player_seekbar);
final ImageView icon = (ImageView) rowView.findViewById(R.id.download_play_icon);
icon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
new voicePlayer(voice_id.get(position), rowView);
}
});
}
}
voicePlayer
class voicePlayer {
MediaPlayer mediaPlayer;
SeekBar seekbar;
TextView voice_duration;
ImageView icon;
WavesAPI.viewHolder rowView;
final Handler handler = new Handler();
public void getViews()
{
this.seekbar= (seekbar) rowView.findViewById ...
this.voice_duration=(TextView) rowView.findViewById ...
this.icon=(ImageView) rowView.findViewById ...
}
public voicePlayer(String voice_id,WavesAPI.View rowView) {
this.rowView=rowView;
getViews();
/*mediaPlayer=new MediaPlayer();
... play the voice
*/
this.icon.setImageResource(R.drawable.pause);
this.updateSeekbar();
} catch (IOException e) {
}
} catch (IOException e) {
}
}
}
private void updateSeekbar()
{
final Runnable runnable = new Runnable() {
public void run() {
int position=// calculate the position of the seekbar
if (mediaPlayer.isPlaying())
{
seekbar.setProgress(position);
handler.postDelayed(this, 50);
voice_duration.setText("duration ...");
}
}
};
handler.post(runnable);
}
答案
您在recyclerview中维护的列表需要使用最新的搜索栏位置进行更新,这是因为recyclerview的工作方式,为了提高性能,它会绑定您的视图并在需要时取消绑定,解除该行的数据已清除,视图将使用从列表中获取的新数据进行回收,因此,如果列表未更新,您将看到较旧的数据。
更新列表,通知对更新程序的更改,这应该工作。
private class Adapter extends ArrayAdapter<Data> {
List<Data> dataList;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
CustomData data = dataList.get(position);
// existing code
int currentSeekarProgress = data.getSeekbarProgress();
seekBar.setProgress(currentSeekarProgress);
return convertView;
}
}
您需要在数据列表中保存最新的搜索栏位置,然后在getView
中获取它。即使行在屏幕上滚动,这也允许您更新并保持位置。
以上是关于滚动时更新自定义列表视图失败的主要内容,如果未能解决你的问题,请参考以下文章