簡體   English   中英

notifyDataSetChanged不刷新RecyclerView

[英]notifyDataSetChanged doesn't refresh RecyclerView

我有一個奇怪的問題。 我從ListView切換到RecyclerView ,我無法刷新或通知我的ListView的更改。 我試着調用Item.this.notifyDataSetChanged(); 和其他方法刷新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;
                }
            });




}

我一直在努力解決類似的問題,試圖處理一個用例,其中所有適配器的內容都必須被替換,而notifyDataSetChanged() -view應該從頭開始 :調用notifyDataSetChanged()swapAdapter()與多種組合對view / layout-manager失效請求的后續調用只會導致(看似)空的回收器視圖。 該視圖甚至沒有嘗試重新綁定視圖持有者。

似乎已經解決的問題是這個黑客攻擊修復:

view.swapAdapter(sameAdapter, true);
view.scrollBy(0, 0);

事實證明, scrollBy (即使有0個偏移)驅動scrollBy -view進行布局,並執行掛起的視圖持有者重新綁定。

如果你想通知你的recycleListView只是簡單的調用notifyDataSetChanged(); 在你的類適配器中。 這是我的適配器類中的方法:

public class ListAdapter extends RecyclerView.Adapter<Listdapter.ViewHolder> {
....
private List<DesaObject> desaObjects= new ArrayList<DesaObject>();

public void setListObjects(List<DesaObject> desaObjects){
        if(this.desaObjects.size()>0)
            this.desaObjects.clear();
        this.desaObjects = desaObjects;
        notifyDataSetChanged();
    }
....

public static class ViewHolder extends RecyclerView.ViewHolder {
       public final View mView;
       public final AppCompatTextView desa;


       public ViewHolder(View view) {
           super(view);
           mView = view;
           desa = (AppCompatTextView) view.findViewById(R.id.desa);
       }

   }
}

在您的代碼中,您實際上沒有在OnClickListener中設置或更改listObjects,請嘗試notifyDataSetChanged(); 而不是Item.this.notifyDataSetChanged();

我不知道為什么會這樣,但是notifyDataSetChanged(); 沒用。 所以我嘗試跟蹤更改的項目並使用notifyItemChanged(int);手動刷新它們notifyItemChanged(int); 到目前為止它似乎正在起作用。 我仍然不確定為什么刷新整個RecyclerView不起作用。

使用更改的數據再次初始化適配器並使用'swapadapter'方法。 希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM