【问题标题】:notifyDataSetChanged() doesn't work with my custom adapternotifyDataSetChanged() 不适用于我的自定义适配器
【发布时间】:2015-05-02 16:33:33
【问题描述】:

我创建了一个简单的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,通过一个活动从另一个Fragment (DialogFragment) 调用refreshAdapter 方法。我使用了调试器,所以我知道调用了refreshAdapter 方法。它只是对显示的 RecyclerView 没有影响。当我离开PastEventFragment然后切换回它,这样onCreateView方法被调用时,所有之前添加的项目都会显示出来,所以ORM没有问题。

【问题讨论】:

    标签: android android-fragments android-adapter android-recyclerview


    【解决方案1】:

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

    mPastEventItemList = PastEventItem.listAll(PastEventItem.class);
    

    但您的适配器仍连接到 mPastEventItemList 的旧引用。

    所以你应该这样做:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多