我有一个奇怪的问题.我从ListView切换到RecyclerView,我无法刷新或通知我的ListView中的更改.我试着调用Item.this.notifyDataSetChanged();
和其他方法刷新View但它不起作用.
而是滚动时(无论方向如何)刷新RecyclerView.如何更改时如何通知我的RecyclerView?
和其他方法刷新View但它不起作用.
而是滚动时(无论方向如何)刷新RecyclerView.如何更改时如何通知我的RecyclerView?
码:
@Override public void onBindViewHolder(Ids holder,final int position) { rowItemClass = (ListViewRow) rowItems.get(position); Log.e("swag","OYOYOYOYOYO"); if (Globals.isPlaying && Globals.pos == position) { if (pausedSamePos == true) { holder.pauseed_play.setVisibility(View.VISIBLE); holder.playing_pause.setVisibility(View.GONE); } else { holder.pauseed_play.setVisibility(View.GONE); holder.playing_pause.setVisibility(View.VISIBLE); } holder.song_currenttime_sb.setActive(); holder.song_duration.setVisibility(View.INVISIBLE); holder.song_duration_sb.setVisibility(View.VISIBLE); holder.seekbar.setActive(); } else { holder.seekbar.setInactive(); holder.song_currenttime_sb.setInactive(); holder.song_icon.setImageResource(rowItemClass.getImageId()); holder.song_duration_sb.setVisibility(View.INVISIBLE); holder.song_duration.setVisibility(View.VISIBLE); holder.pauseed_play.setVisibility(View.GONE); holder.playing_pause.setVisibility(View.GONE); } sharedPreference = new SharedPreference(); holder.song_duration.setTypeface(Globals .getTypefaceSecondary(context)); holder.song_duration_sb.setTypeface(Globals .getTypefaceSecondary(context)); holder.song_name.setTypeface(Globals.getTypefacePrimary(context)); holder.song_currenttime_sb.setTypeface(Globals .getTypefaceSecondary(context)); holder.song_name.setText(rowItemClass.getTitle()); holder.song_duration.setText(rowItemClass.getDesc()); holder.song_duration_sb.setText(rowItemClass.getDesc()); holder.favorite.setTag(position); holder.song_currenttime_sb.setTag(position); holder.seekbar.setTag(position); holder.clickRegister.setTag(position); holder.song_icon.setTag(position); holder.song_name.setTag(position); holder.song_duration.setTag(position); holder.song_duration_sb.setTag(position); holder.more_options.setTag(position); // int task_id = (Integer) holder.seekbar.getTag(); final Ids finalHolder = holder; holder.clickRegister.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { if ((Globals.isPlaying.booleanValue()) && (Globals.pos == position)) { pausePlaying(); } else { Globals.stopPlaying(); pausedSamePos = false; Globals.pos = position; Globals.isPlaying = true; Item.this.notifyDataSetChanged(); Globals.mp = MediaPlayer.create(context,Integer .valueOf(Item.this.songPos[position]) .intValue()); Globals.mp.start(); Globals.pos = position; Globals.isPlaying = Boolean.valueOf(true); Item.this.notifyDataSetChanged(); Globals.mp .setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion( MediaPlayer mpOnComplete) { mpOnComplete.release(); Globals.isPlaying = false; pausedSamePos = false; Globals.isPlaying = Boolean .valueOf(false); finalHolder.menu_options .startAnimation(new ViewExpandAnimation( finalHolder.menu_options)); Item.this.notifyDataSetChanged(); } }); } } catch (Exception localException) { } } }); holder.clickRegister .setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { Globals.stopPlaying(); Item.this.notifyDataSetChanged(); return true; } }); }
解决方法
我一直在努力解决类似的问题,试图处理一个用例,其中所有适配器的内容都必须被替换,而recycleler-view应该从头开始:调用notifyDataSetChanged(),swapAdapter()与多种组合对view / layout-manager失效请求的后续调用只会导致(看似)空的回收器视图.该视图甚至没有尝试重新绑定视图持有者.
似乎已经解决的问题是这个hack-ish修复:
view.swapAdapter(sameAdapter,true); view.scrollBy(0,0);
事实证明,scrollBy(即使有0个偏移)驱动Recycler-view进行布局,并执行挂起的视图持有者重新绑定.