Android notifyDataSetChanged()不';无法使用自定义适配器
我创建了一个简单的Android notifyDataSetChanged()不';无法使用自定义适配器,android,android-fragments,android-adapter,android-recyclerview,Android,Android Fragments,Android Adapter,Android Recyclerview,我创建了一个简单的RecyclerView.Adapter,它正确地显示了内容,但是当我在上面调用notifyDataSetChanged()时,它就不起作用了 PastEventFragment public class PastEventFragment extends Fragment { private RecyclerView mRecyclerView; private List<PastEventItem> mPastEventItemList;
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();
}
}
公共类PastEventFragment扩展片段{
私人回收视图mRecyclerView;
私有列表MPaStevenItemList;
私人PastEventAdapter MPaStevenAdapter;
公共PastEventFragment(){
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
super.onCreateView(充气机、容器、保存状态);
View pastEvent=充气机。充气(R.layout.fragment\u pass\u事件,容器,false);
mRecyclerView=(RecyclerView)pastEvent.findviewbyd(R.id.pe_rv);
setLayoutManager(新的LinearLayoutManager(getActivity());
mPastEventItemList=PastEventItem.listAll(PastEventItem.class);
mpasteventapter=new-pasteventapter(mPastEventItemList,getActivity());
mRecyclerView.setAdapter(MPaStevenAdapter);
回风口;
}
公共空刷新适配器(){
mPastEventItemList.clear();
mPastEventItemList=PastEventItem.listAll(PastEventItem.class);
mpasteventapter.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);
}
}
}
公共类PastEventAdapter扩展了RecyclerView.Adapter{
私人名单;
私有上下文;
公共PastEventAdapter(列表pastEventItemList,上下文){
this.pastEventItemList=pastEventItemList;
this.mContext=上下文;
}
@凌驾
public int getItemCount(){
返回pastEventItemList.size();
}
@凌驾
BindViewHolder上的公共void(PastEventHolder PastEventHolder,int i){
PastEventItem pei=pastEventItemList.get(i);
开关(pei型){
案例1:
pastEventHolder.type.setText(mContext.getResources().getString(R.string.string1));
打破
案例2:
pastEventHolder.type.setText(mContext.getResources().getString(R.string.string2));
打破
案例3:
pastEventHolder.type.setText(mContext.getResources().getString(R.string.string3));
打破
案例4:
pastEventHolder.type.setText(mContext.getResources().getString(R.string.string4));
打破
}
pastEventHolder.ml.setText(Integer.toString(pei.ml));
pastEventHolder.per.setText(Integer.toString(pei.per));
}
@凌驾
public PastEventHolder onCreateViewHolder(视图组视图组,int i){
视图项视图=布局调整器。
来自(viewGroup.getContext())。
充气(R.layout.pass\u event\u item,viewGroup,false);
返回新的PastEventHolder(itemView);
}
公共静态类PastEventHolder扩展了RecyclerView.ViewHolder{
私有文本视图类型;
私有文本视图ml;
私密文本浏览;
公共粘贴文件夹(视图v){
超级(五);
type=(TextView)v.findViewById(R.id.pe_type);
ml=(TextView)v.findViewById(R.id.pe_ml);
per=(文本视图)v.findviewbyd(R.id.pe_per);
}
}
}
我使用
接口
,通过活动从另一个片段(对话框片段
)调用刷新适配器
方法。我使用了调试器,因此我知道调用了refreshAdapter
方法。它只是对显示的RecyclerView没有影响。当我离开PastEventFragment
然后切换回它,以便调用onCreateView
方法时,会显示以前添加的所有项,因此ORM没有问题 尝试在适配器中添加setItemList()
方法。并使用此方法对适配器设置更新的列表数据,然后调用notifyDatasetChange方法您的适配器引用了mPastEventItemList
。但是,您正在这一行代码中创建一个新列表(新引用):
mPastEventItemList = PastEventItem.listAll(PastEventItem.class);
但是您的适配器仍然连接到mpasventitemlist
的旧引用
因此,你应该这样做:
public void refreshAdapter() {
mPastEventItemList.clear();
mPastEventItemList.addAll(PastEventItem.listAll(PastEventItem.class));
mPastEventAdapter.notifyDataSetChanged();
}