2015-12-05 5 views
4

У меня есть странная проблема. Я переключился на RecyclerView с ListView, и я не могу обновить или уведомить об изменении в своем ListView. Я попробовал позвонить Item.this.notifyDataSetChanged(); и другие способы обновления View, но это не сработает. Вместо этого RecyclerView обновляется при прокрутке (независимо от направления). Как я могу уведомить RecyclerView, когда произошли изменения?notifyDataSetChanged не обновляет 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; 
       } 
      }); 




} 
+0

Если вы используете шаблон зрителя в своих списках, на самом деле нет реального преимущества при использовании просмотров ресайклером imo – Bhargav

+0

Ну, это должно быть лучше для анимации. Кроме того, он работает лучше в FragmentView. Старый ListView вызывал метод GetView, даже когда ничего не происходило, что приводило к очень низкой производительности. –

+0

Вы можете отправить код адаптера для переработчика – Ramesh

ответ

1

Я не уверен, почему это, но notifyDataSetChanged(); не работал. Поэтому я попытался отслеживать измененные элементы и обновлять их вручную с помощью notifyItemChanged(int);, и пока это работает. Я все еще не уверен, почему обновление всего RecyclerView не помогло.

0

Инициализировать ваш адаптер снова с измененными данными и способ использования "swapadapter. Надеюсь, поможет.

2

, если вы хотите уведомить свой 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); 
     } 

    } 
} 

в вашем коде, вы не на самом деле установить или изменить listObjects в OnClickListener и, пожалуйста, попробуйте notifyDataSetChanged(); вместо Item.this.notifyDataSetChanged();

+0

Ну, я устанавливаю состояние некоторых объектов, некоторые объекты инициализируются для обновления (текст/поиск). Другие объекты установлены видимыми, все, что работает, за исключением части обновления. SeekBar и TextView не обновляются до тех пор, пока не будет прокручено изображение (они обновляются, но прогресс не отображается) И изменение на 'notifyDataSetChanged();' ничего не меняет. –

3

Я упорно борется с подобным вопросом, пытаясь справиться с потребительной случай, когда все содержимое адаптера должен быть заменен и ресайклер ракурс должен начать с нуля: вызов notifyDataSetChanged(), swapAdapter() с многочисленными комбинации последующих обращений к запросам недействительности view/layout-manager приводили к простому (по-видимому) пустующему виду ресайклеров. Представление даже не пыталось перепроверить держателей.

Что, казалось, работали его это хак-иш фикс:

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

Как выясняется, scrollBy (даже при 0 смещениями) гонит ресайклер ракурс в выложив свои взгляды и выполнив ожидающих просмотра.

+0

Проклятый чувак, вы не представляете, как эта проблема сводит меня с ума. Случайно, notifyDataSetChanged работал, а иногда и нет, но как только я немного прокрутил пальцами, он обновился. .scrollBy (0, 0) отлично выполняет трюк, но в коде RecyclerView определенно что-то не так. Thaanks! –

+0

Вы и я оба, @SimonNinon :-) Рад помочь! – d4vidi