2016-04-06 2 views
0

У меня есть фрагмент с RecyclerView, который я хочу обновить после получения некоторых данных из IntentService.Адаптер RecyclerView notifyDataSetChanged не работает

Заканчивается служба и отправляют данные в фрагмент с использованием Otto EventBus.I может подтвердить, что причину я добавляю некоторые сообщения журнала и напечатать некоторые значения, например: dataSet.get(0).getName(). После того, что я называю adapter.notifyDataSetChanged(), но на моем экране ничего не появляется.

Я могу дать вам код моего пользовательского адаптера, если вы думаете, что это может помочь:

public class FilteredVideoListAdapter extends RecyclerView.Adapter<FilteredVideoListAdapter.ViewHolder> { 

public static final String TAG = "FILTEREDVIDEO-ADAPTER"; 

public List<FilteredVideo> data; 
public Context context; 

public FilteredVideoListAdapter(List<FilteredVideo> data) { 
    this.data = data; 

} 


public static class ViewHolder extends RecyclerView.ViewHolder { 
    TextView tvTitle; 
    TextView tvSubtitle; 
    ImageView imageView; 

    public ViewHolder(View itemView) { 
     super(itemView); 

     tvTitle = (TextView) itemView.findViewById(R.id.tv_filtered_video_title); 
     tvSubtitle = (TextView) itemView.findViewById(R.id.tv_filtered_video_subtitle); 
     imageView = (ImageView) itemView.findViewById(R.id.iv_filtered_video_image); 
    } 

} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    context = parent.getContext(); 
    View v = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.item_filtered_video, parent, false); 

    return new ViewHolder(v); 
} 

@Override 
public void onBindViewHolder(ViewHolder viewHolder, int position) { 
    viewHolder.tvTitle.setText(data.get(position).getName()); 
    viewHolder.tvSubtitle.setText(data.get(position).getDataUrl()); 

    int dimen = context.getResources().getDimensionPixelSize(R.dimen.filtered_video_image_size); 

    Picasso.with(context) 
      .load(data.get(position).getThumbnailUrl()) 
      .resize(dimen, dimen) 
      .into(viewHolder.imageView); 
} 

@Override 
public int getItemCount() { 
    return data.size(); 
} 

}

и код класса фрагмента:

public class FilteredVideoListFragment extends BaseFragment { 

private static final String TAG = "FILTEREDVLIST-FRAGMENT"; 
public RecyclerView recyclerView; 

protected FilteredVideoListAdapter adapter; 
protected RecyclerView.LayoutManager layoutManager; 

public List<FilteredVideo> dataSet; 

//first time there aren't any populated data 
private boolean datasetIsNull = true; 

public static FilteredVideoListFragment newInstance() { 
    return new FilteredVideoListFragment(); 
} 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    dataSet = new ArrayList<>(); 

    BusProvider.getInstance().register(this); 

    // startService here - 
    Intent intentService = new Intent(activity, GetMostPopularIntentService.class); 
    activity.startService(intentService); 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_filtered_video_list, container, false); 

    recyclerView = (RecyclerView) view.findViewById(R.id.rv_filtered_video_list); 

    recyclerView.setHasFixedSize(true); 
    recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), 
      DividerItemDecoration.VERTICAL_LIST)); 

    layoutManager = new LinearLayoutManager(getActivity()); 
    recyclerView.setLayoutManager(layoutManager); 

    adapter = new FilteredVideoListAdapter(dataSet); 
    recyclerView.setAdapter(adapter); 

    return view; 
} 

private BroadcastReceiver mostpopularReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String resultCode = intent.getStringExtra("resultCode"); 
     if ("OK".equals(resultCode)) { 
      Toast.makeText(activity, "Most Popular Results Received!", Toast.LENGTH_SHORT).show(); 
     } 
    } 
}; 

/** Register/ unRegister Receiver */ 
@Override 
public void onResume() { 
    super.onResume(); 
    IntentFilter intentFilter = new IntentFilter(GetMostPopularIntentService.ACTION); 
    LocalBroadcastManager.getInstance(activity).registerReceiver(mostpopularReceiver, intentFilter); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    LocalBroadcastManager.getInstance(activity).unregisterReceiver(mostpopularReceiver); 
} 

/** 
* Receives Event from GetMostPopularIntentService when data retrieved 
* successfully. 
*/ 
@Subscribe 
public void onMostPopularReceivedEvent(MostPopularReceivedEvent event) { 
    Log.i(TAG, "clickevent "); 

    dataSet = event.getFilteredVideoList(); 
    Log.i(TAG, "NOTIFY ADAPTER SIZE == " + dataSet.size()); 
    Log.i(TAG, "NOTIFY ADAPTER SIZE == " + dataSet.get(0).getName()); 
    adapter.notifyDataSetChanged(); 
    Log.i(TAG, "AFTER NOTIFY ADAPTER "); 
} 

@Subscribe 
public void onToastRequest(ToastRequest request) { 
    Log.i(TAG, "onToastRequest "); 
    Toast.makeText(activity, request.message, request.duration).show(); 
} 

}

+0

Без кода для того, как вы на самом деле используете адаптер, это трудно помочь. –

+0

@ cricket_007 вы правы. Я обновил вопрос с помощью соответствующего кода. – Mes

+0

Does 'dataSet.addAll (event.getFilteredVideoList());' исправлять что-нибудь? –

ответ

-1

Попробуйте этот адаптер

public class FilteredVideoListAdapter extends RecyclerView.Adapter<FilteredVideoListAdapter.ViewHolder> { 

    public static final String TAG = "FILTEREDVIDEO-ADAPTER"; 

    public List<FilteredVideo> data; 
    public Context mContext; 

    public FilteredVideoListAdapter(Context context, List<FilteredVideo> data) { 
     this.data = data; 
     this.mContext = context; 

    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_filtered_video, null); 

     return new ViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder customViewHolder, int i) { 
     FilteredVideo filteredVideo = data.get(i); 

     customViewHolder.tvTitle.setText(filteredVideo.getName()); 
     customViewHolder.tvSubtitle.setText(filteredVideo.getDataUrl()); 

     int dimen = mContext.getResources().getDimensionPixelSize(R.dimen.filtered_video_image_size); 

     Picasso.with(mContext) 
       .load(filteredVideo.getThumbnailUrl()) 
       .resize(dimen, dimen) 
       .into(customViewHolder.imageView); 
    } 

    @Override 
    public int getItemCount() { 
     return (null != data ? data.size() : 0); 
    } 

} 

И вызов в вашем фрагменте как этот

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_filtered_video_list, container, false); 

    recyclerView = (RecyclerView) view.findViewById(R.id.rv_filtered_video_list); 

    recyclerView.setHasFixedSize(true); 
    recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), 
      DividerItemDecoration.VERTICAL_LIST)); 

    layoutManager = new LinearLayoutManager(getActivity()); 
    recyclerView.setLayoutManager(layoutManager); 

    adapter = new FilteredVideoListAdapter(getActivity(), dataSet); 
    recyclerView.setAdapter(adapter); 

    return view; 
} 
+1

Просто глядя на этот код, я могу сказать, что все, что вы добавили, было контекстом для конструктора адаптера. Ничего другого не изменилось из кода в вопросе. –

0

Try -

@Subscribe 
public void onMostPopularReceivedEvent(MostPopularReceivedEvent event) { 

    adapter = new FilteredVideoListAdapter(event.getFilteredVideoList()); 
    recyclerView.setAdapter(adapter); 
}