fragmentStatePagerAdapter正确的数据,但片段上的适配器不正确

时间:2014-06-16 17:43:13

标签: android android-viewpager android-pageradapter

我有一个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));
}

2 个答案:

答案 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));
}