notifyDataSetChanged() 不适用于我的自定义适配器

notifyDataSetChanged() doesn't work with my custom adapter

我创建了一个简单的 RecyclerView.Adapter 并正确显示了内容,但是当我对其调用 notifyDataSetChanged() - 它不起作用。

PastEventFragment

public class PastEventFragment extends Fragment {
    private RecyclerView mRecyclerView;
    private List<PastEventItem> mPastEventItemList;
    private PastEventAdapter mPastEventAdapter;

    public PastEventFragment() {

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        View pastEvent = inflater.inflate(R.layout.fragment_past_event, container, false);
        mRecyclerView = (RecyclerView) pastEvent.findViewById(R.id.pe_rv);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        mPastEventItemList = PastEventItem.listAll(PastEventItem.class);
        mPastEventAdapter = new PastEventAdapter(mPastEventItemList, getActivity());
        mRecyclerView.setAdapter(mPastEventAdapter);

        return pastEvent;
    }

    public void refreshAdapter() {
        mPastEventItemList.clear();
        mPastEventItemList = PastEventItem.listAll(PastEventItem.class);
        mPastEventAdapter.notifyDataSetChanged();
    }



}

适配器:

public class PastEventAdapter extends RecyclerView.Adapter<PastEventAdapter.PastEventHolder> {

    private List<PastEventItem> pastEventItemList;
    private Context mContext;

    public PastEventAdapter(List<PastEventItem> pastEventItemList, Context context) {
        this.pastEventItemList = pastEventItemList;
        this.mContext = context;
    }


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

    @Override
    public void onBindViewHolder(PastEventHolder pastEventHolder, int i) {
        PastEventItem pei = pastEventItemList.get(i);
        switch (pei.type) {
            case 1:
                pastEventHolder.type.setText(mContext.getResources().getString(R.string.string1));
                break;
            case 2:
                pastEventHolder.type.setText(mContext.getResources().getString(R.string.string2));
                break;
            case 3:
                pastEventHolder.type.setText(mContext.getResources().getString(R.string.string3));
                break;
            case 4:
                pastEventHolder.type.setText(mContext.getResources().getString(R.string.string4));
                break;
        }

        pastEventHolder.ml.setText(Integer.toString(pei.ml));
        pastEventHolder.per.setText(Integer.toString(pei.per));
    }

    @Override
    public PastEventHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View itemView = LayoutInflater.
                from(viewGroup.getContext()).
                inflate(R.layout.past_event_item, viewGroup, false);

        return new PastEventHolder(itemView);
    }


    public static class PastEventHolder extends RecyclerView.ViewHolder {
        private TextView type;
        private TextView ml;
        private TextView per;

        public PastEventHolder(View v) {
            super(v);
            type = (TextView) v.findViewById(R.id.pe_type);
            ml = (TextView) v.findViewById(R.id.pe_ml);
            per = (TextView) v.findViewById(R.id.pe_per);
        }
    }
}

我使用 Interface 通过 Activity 从另一个 Fragment (DialogFragment) 调用 refreshAdapter 方法。我使用了调试器,所以我知道调用了 refreshAdapter 方法。它只是对显示的 RecyclerView 没有影响。当我离开 PastEventFragment 然后切换回它,以便调用 onCreateView 方法时,会显示所有以前添加的项目,因此 ORM 没有问题。

尝试在适配器中添加一个 setItemList() 方法。并使用此方法与适配器设置更新的列表数据,在此之后,调用 notifyDatasetChange 方法

您的适配器引用了 mPastEventItemList。但是,您正在这行代码中创建一个新列表(一个新引用):

mPastEventItemList = PastEventItem.listAll(PastEventItem.class);

但您的适配器仍连接到 mPastEventItemList 的旧参考。

所以你应该这样做:

 public void refreshAdapter() {
        mPastEventItemList.clear();
        mPastEventItemList.addAll(PastEventItem.listAll(PastEventItem.class));
        mPastEventAdapter.notifyDataSetChanged();
    }