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();
}
我创建了一个简单的 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();
}