2017-09-07 7 views
1

notigyDataSetChanged funktioniert nicht! Die Liste im Adapter ist nach der notifyDataSetChanged-Methode immer noch leer.RecyclerView notifyDataSetChanged funktioniert nicht, die Liste im Adapter ist nach der notifyDataSetChanged-Methode immer noch leer

MainActivity:

//left menu 
mRvLeftMenu = (RecyclerView) mSlidingMenu.findViewById(R.id.rv_left_menu); 
//set layout manager 
mRvLeftMenu.setLayoutManager(new LinearLayoutManager(this)); 
//init list 
mSlidingData = new ArrayList<>(); 
mLeftMenuAdapter = new LeftMenuAdapter(this, mSlidingData); 
//set adapter 
mRvLeftMenu.setAdapter(mLeftMenuAdapter); 


@Override 
public void onLoadFinished(int requestType, BaseResultBean resultBean) { 
    switch (requestType) { 
     case MyConstants.REQUEST_RESULT_NEWS_CENTER: 
      List<NewsResultBean.DataBean> list = ((NewsResultBean) resultBean).getData(); 

gut funktioniert wie folgt

//    mLeftMenuAdapter = new LeftMenuAdapter(this, list); 
//    mRvLeftMenu.setAdapter(mLeftMenuAdapter); 

wenn ich die Daten an die mSlidingData es funktionierte nicht nur hinzufügen, RecyclerView nicht aktualisieren würde! Warum?

  mSlidingData.addAll(list); 
      mLeftMenuAdapter.notifyDataSetChanged(); 

und nach dem NotifyDataSetChanged-Aufruf ist die mList im Adapter noch leer! Gleich wie unten.

  mRvLeftMenu.getAdapter().notifyDataSetChanged(); 
      break; 
    } 
} 

Adapter:

public class LeftMenuAdapter extends RecyclerView.Adapter<LeftMenuAdapter.VH> { 
    private List<NewsResultBean.DataBean> mList; 
    private Context mContext; 
    private OnItemClickListener mOnItemClickListener; 

    public LeftMenuAdapter(Context context, List<NewsResultBean.DataBean> list) { 
     mList = list; 
     mContext = context; 
    } 

    @Override 
    public VH onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = View.inflate(mContext, R.layout.item_left_menu, null); 
     return new VH(view); 
    } 

    @Override 
    public void onBindViewHolder(final VH holder, int position) { 
     holder.mTvLeftMenu.setText(mList.get(position).getTitle()); 
     final int tempPosition = position; 
     holder.mView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (mOnItemClickListener != null){ 
        mOnItemClickListener.onItemClicked(v,tempPosition); 
       } 
      } 
     }); 
    } 

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

    class VH extends RecyclerView.ViewHolder { 
     @BindView(R.id.tv_left_menu) 
     TextView mTvLeftMenu; 
     View mView; 
     public VH(View itemView) { 
      super(itemView); 
      mView = itemView; 
      ButterKnife.bind(this,mView); 
     } 
    } 

    interface OnItemClickListener{ 
     void onItemClicked(View view,int position); 
    } 

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) { 
     mOnItemClickListener = onItemClickListener; 
    } 
} 
+0

Sie passieren die leere Arraylist 'mSlidingData' an den Adapter contructor. Das wird nie geändert. Sie müssen die Elemente vor dem Aufruf der Adapterklasse hinzufügen. –

+0

Ändern Sie den mSlidingData-Wert irgendwo in Ihrer Aktivität? – algrid

+0

Ja, ich habe meinen Code erneut überprüft und den mSlidingData-Wert nach einer Netzwerkanforderung geändert. –

Antwort

0

THX für Ihre Hilfe Gefährten! Ich habe einen dummen Fehler gemacht, ich habe mSlidingData nach einer Netzwerkanfrage in eine andere Liste geändert.

//after network request 
private void processResult(String response) { 
    Gson gson = new Gson(); 
    NewsResultBean newsResultBean = gson.fromJson(response, NewsResultBean 
      .class); 
    Log.d(TAG, "onResponse: " + newsResultBean.toString()); 
    //pass the result data to MainActivity,changed the mSlidingData to a new list, 
    //cause RecyclerView notifyDataSetChanged method not work! 
//      mActivity.setSlidingData(newsResultBean.getData()); 

setSlidingData Methode wie folgt:

public void setSlidingData(List<NewsResultBean.DataBean> slidingData) { 
    mSlidingData = slidingData; 
} 
+0

Das passiert den Besten von uns. Mach weiter :) –

Verwandte Themen