我有一个ListFragment来显示基于特定日期的数据列表。
这一天作为我的fragmentStatePagerAdapter的getItem()
函数的参数传递。
public Fragment getItem(int position) {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_YEAR, -(mNumDays - (position + 1)));
return MyFragment.initNewInstance(calendar.getTimeInMillis(),
position,
mNumDays);
}
我还有一个LoaderManager,用于在发布数据库更改时加载数据。
在我的ListFragment的onCreate()
功能上,我得到天,在onCreateLoader
我根据特定日期查询数据库。< / p>
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.mDateToShow = getArguments() != null ? getArguments().getString("date") : "";
}
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
String sameDay = ChronomasterDatabaseHelper.KEY_DATE_TIME +"='"+ mDateToShow +"'";
return new CursorLoader(getActivity(), uri, null, sameDay, null, null);
}
在onLoadFinished()
功能上我启动一个新线程来获取数据并更新我的 BaseAdapter 的 ArrayList ,它负责显示特定的数据形式。
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
if ((cursor == null) || (cursor.isClosed())) {
return;
}
try {
new UpdateDataHelper(cursor).executeOnExecutor();
}catch (RejectedExecutionException rejectedExecutionException){
Log.d(LOGTAG,"Task to update data was rejected");
}
}
在帖子上:
protected void onPostExecute(ArrayList<Application> result) {
mAdapter.setData(result);
super.onPostExecute(result);
}
但是,从调试中我可以看到显示给设备的数据是正确的(正确日期的正确数据),但实际数据不正确!
我的意思是什么?
当我向页面滑动时,查询的数据是第二天的数据(特定日实际上是第二天),而我的 BaseAdapter 有下一天的数据。 我知道默认情况下是fragmentStatePagerAdapter,不仅加载了可见片段,还加载了下一个和前一个片段。
我如何解决此问题?
当我点击屏幕上的某个项目(onListItemClick)时,我得到索引Out Of Bounds Exception,因为我的 BaseAdapter ArrayList 第二天有#39 ; s数据。
@Override
public void onListItemClick(ListView listView, View view, int pos, long id)
{
appClicked(mAdapter.getItem(pos - 1));
}
答案 0 :(得分:0)
您可以使用的解决方法是使用mViewPager.setOffscreenPageLimit(0);
加载该页面
这样,正在加载的数据是针对当前页面的。缺点是它看起来不会很平滑,因为每个片段只有当它是当前片段时才会被加载。
答案 1 :(得分:0)
解决方案是在我的Fragment上有一个私有的ArrayList并在那里添加数据。
private ArrayList<Application> mResults = new ArrayList<>();
然后在我的线程上添加我的字段上的数据(每次都不创建新的ArrayList):
mResults.add(new Application(data1,data2,data3));
mAdapter.setData(mResults,totalDuration,totalTimes);
和onListItemClick
public void onListItemClick(ListView listView, View view, int pos, long id)
{
appClicked(mResults.get(pos - 1));
}