我有一个viewpageradapter,每天一页,每页一个listview。我正试着把livedata加入其中。
现在,它正在这样做:
打开应用程序
i/oncreateview:startdate=1608958800 items.size()=0
i/oncreateview:startdate=1608786000项。size()=0
i/onchanged:startdate=1608786000 items.size()=2
i/onchanged:startdate=1608786000 items.size()=2
我看到今天的名单,应该有两个项目,它是准确的。
向右滑动
i/oncreateview:startdate=1607922000项。size()=2
i/onchanged:startdate=1607922000 items.size()=2
我看到前一天的清单,应该有4个项目,它有今天的清单。
再次向右滑动
i/oncreateview:startdate=1607835600 items.size()=0
i/onchanged:startdate=1607835600 items.size()=0
我前天看到的,应该有4个项目,而且是空的。
向左滑动
i/oncreateview:startdate=1608958800 items.size()=0
i/onchanged:startdate=1608958800 items.size()=0
昨天的名单上还有今天的数据。
再次向左滑动
没有日志,今天的名单也被销毁了。
下面是我片段中的一些代码:
if (bundle != null) {
sTitle = bundle.getString("title");
setTitle(sTitle);
year = 1900 + bundle.getInt("year");
month = bundle.getInt("month");
day = bundle.getInt("day");
Calendar calendar = Calendar.getInstance();
calendar.set(year, month, day, 0, 0, 0);
startDate = (int) (calendar.getTimeInMillis() / 1000L);
}
dataViewModel = new ViewModelProvider(this, new dataViewModelFactory(getActivity().getApplication(), startDate)).get(dataViewModel.class);
List<listItems> items = dataViewModel.getDataByDate().getValue();
if (items == null)
items = new ArrayList<>();
Log.i("OnCreateView", "startDate = " + startDate + " items.size() = " + items.size());
MyArrayAdapter adapter = new MyArrayAdapter(this.getActivity(), items);
theListView.setAdapter(adapter);
dataViewModel.getDataByDate().observe(getViewLifecycleOwner(), new Observer<List<data>>() {
@Override
public void onChanged(List<listItems> data) {
List<listItems> items = data;
if (items == null)
items = new ArrayList<>();
Log.i("OnChanged", "startDate = " + startDate + " items.size() = " + items.size());
adapter.setExercises(items);
}
});
从我的myarrayadapter:
public void setExercises(List<listItems> mListItems) {
this.clear();
this.addAll(mListItems);
notifyDataSetChanged();
}
以及我的viewmodel:
public class DataViewModel extends AndroidViewModel {
private Repository repository;
Integer startDate;
public static LiveData<List<listItems>> mItems = null;
public DataViewModel(Application application, Integer startDate) {
super(application);
this.startDate = startDate;
repository = new Repository(application);
}
public LiveData<List<listItems>> getDataByDate() {
if (mItems == null) {
mItems = repository.getDataByDate(startDate);
}
return mItems;
}
}
以及我的viewmodelfactory:
public class DataViewModelFactory implements ViewModelProvider.Factory {
private Application mApplication;
private Integer mParam;
public DataViewModelFactory(Application application, Integer param) {
mApplication = application;
mParam = param;
}
@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
return (T) new DataViewModel(mApplication, mParam);
}
}
从我的基本活动来看:
public void ShowCards(Map<Integer, Long> map, Class<?> fragment) {
Log.i("BaseActivity", "ShowCards" );
Integer started;
Long id;
for (Map.Entry<Integer, Long> entry : map.entrySet()) {
started = entry.getKey();
id = entry.getValue();
Log.i("BaseActivity: ShowCards", "started(" + started + ") id (" + id + ") [3]");
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(started * 1000L);
addPage(id, calendar.get(Calendar.YEAR) - 1900, calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), fragment);
}
}
public void addPage(Long id, int year, int month, int day, Class<?> fragment) {
Log.i("BaseActivity", "addPage: fragment: " + fragment.getName());
Log.i("BaseActivity", "addPage: id: " + id);
Log.i("BaseActivity", "addPage: year: " + year);
Log.i("BaseActivity", "addPage: month: " + month);
Log.i("BaseActivity", "addPage: day: " + day);
Bundle bundle = new Bundle();
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); //TODO: Put dateFormat in the string table.
Date date = new Date(year, month, day);
String pagename = sdf.format(date);
bundle.putString("title", pagename);
bundle.putInt("year", year);
bundle.putInt("month", month);
bundle.putInt("day", day);
bundle.putLong("id", id);
BaseFragment myFragment = null;
try {
myFragment = (BaseFragment) fragment.newInstance();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
Log.i("BaseActivity", "addPage: myFragment: " + myFragment.toString() + " bundle = " + bundle.toString() + "[4]");
myFragment.setArguments(bundle);
viewPagerAdapter.addFrag(myFragment, pagename, id);
viewPagerAdapter.notifyDataSetChanged();
Log.i("BaseActivity: addPage", "viewPageAdapter.getCount() = " + viewPagerAdapter.getCount());
viewPager.setCurrentItem(viewPagerAdapter.getCount() - 1);
}
我的viewpageradapter:
public class ViewPagerAdapter extends FragmentStatePagerAdapter {
private final ArrayList<Fragment> mFragmentList = new ArrayList<>();
private final ArrayList<Long> mFragmentIdList = new ArrayList<>();
private final ArrayList<String> mFragmentTitleList = new ArrayList<>();
Context context;
ViewPager viewPager;
public ViewPagerAdapter(FragmentManager manager, Context context, ViewPager viewPager) {
super(manager);
this.context = context;
this.viewPager = viewPager;
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFrag(Fragment fragment, String title, Long Id) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
mFragmentIdList.add(Id);
notifyDataSetChanged();
}
谢谢你的帮助。
暂无答案!
目前还没有任何答案,快来回答吧!