滚动时更新自定义列表视图失败

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中获取它。即使行在屏幕上滚动,这也允许您更新并保持位置。

以上是关于滚动时更新自定义列表视图失败的主要内容,如果未能解决你的问题,请参考以下文章

在片段中创建自定义列表视图时出错所需活动,找到片段

在我的 android 应用程序中滚动列表视图时,数据正在消失。我在片段中使用列表视图

如何从片段内的列表视图打开链接网址?

如何在滚动列表视图上显示/隐藏底部导航视图?

如何在片段内创建自定义列表视图

第一次进入片段ListView时AsyncTask更新progressBar的进度失败,滚动ListView后就ok了