【问题标题】:RecyclerView notifyDataSetChanged not work, list in the adapter is still empty after the notifyDataSetChanged methodRecyclerView notifyDataSetChanged 不起作用,在适配器中的列表在 notifyDataSetChanged 方法后仍然为空
【发布时间】:2017-09-07 18:16:30
【问题描述】:

notigyDataSetChanged 不起作用! 在 notifyDataSetChanged 方法之后适配器中的列表仍然是空的。

主活动:

//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();

像这样工作得很好

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

如果我只是将数据添加到 mSlidingData 它不起作用,RecyclerView 不会刷新!为什么?

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

在 notifyDataSetChanged 调用之后 Adapter 中的 mList 仍然是空的!同下。

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

适配器:

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;
    }
}

【问题讨论】:

  • 您将空数组列表mSlidingData 传递给适配器构造函数。这是永远不会改变的。您需要在调用适配器类之前添加项目。
  • 您是否正在更改活动中某处的 mSlidingData 值?
  • 是的,我再次检查了我的代码,我在网络请求后更改了 mSlidingData 值。

标签: android android-recyclerview notifydatasetchanged


【解决方案1】:

感谢您的帮助! 我犯了一个愚蠢的错误,我在网络请求后将 mSlidingData 更改为另一个列表。

//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 方法如下:

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

【讨论】:

    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 2018-11-23
    • 2023-03-24
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多