使用来自 CalendarProvider 的光标在 ListView 上无限滚动

Endless scrolling on ListView with cursor from the CalendarProvider

我正在使用 ListView 显示来自 CalendarProvider 的事件实例列表。最初我查询从 Today-1Month 到 Today+1Month 的所有实例。当用户滚动到 ListView 的顶部或底部时,它应该加载下个月或上个月。现在我已经实现了 OnScrollListener 并检测到顶部和底部滚动。但是现在我不知道该怎么办。如何向游标添加数据?或者这对 CursorAdapter 来说是不可能的吗?我是否必须创建某种 DTO 或类似的东西?

这是我的代码

public class ScheduleFragment extends Fragment implements AbsListView.OnScrollListener {
//Start and End date for queries
private long mStartDate;
private long mEndDate;

private int mPreviousLastItem = -1;
private int mPreviousFirstitem = -1;

public ScheduleFragment() {
    // Required empty public constructor
}


public static ScheduleFragment newInstance() {
    ScheduleFragment fragment = new ScheduleFragment();
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_schedule, container, false);
    setupListView(view);
    return view;
}

private void setupListView(View container) {
    try {

        ListView listView = (ListView) container.findViewById(R.id.fragment_schedule_list);
        listView.setOnScrollListener(this);
        ContentResolver cr = getActivity().getContentResolver();

        //calculate the initial start and end date
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MONTH, -1);
        mStartDate = calendar.getTimeInMillis();
        calendar = Calendar.getInstance();
        calendar.add(Calendar.MONTH, +1);
        mEndDate = calendar.getTimeInMillis();

        //query the event instances
        Uri.Builder builder = CalendarContract.Instances.CONTENT_URI.buildUpon();
        ContentUris.appendId(builder, mStartDate);
        ContentUris.appendId(builder, mEndDate);
        // Submit the query and get a Cursor object back.
        Cursor cursor = cr.query(builder.build(), new String[]{BaseColumns._ID, CalendarContract.Instances.TITLE}, null, null, null);

        CursorAdapter cursorAdapter = new ScheduleCursorAdapter(getActivity(), cursor);
        listView.setAdapter(cursorAdapter);

    } catch (Exception e) {
        //TODO handle permissions
        e.printStackTrace();
    }

}
@Override
public void onScrollStateChanged(AbsListView absListView, int i) {

}

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
    if (view.getChildCount() > 0 && firstVisibleItem == 0) {
        if (mPreviousFirstitem != firstVisibleItem) {
            //load mStartDate-1 Month to mStartDate
        }
    }
    final int lastItem = firstVisibleItem + visibleItemCount;
    if (view.getChildCount() == 0 || lastItem == totalItemCount) {
        if (mPreviousLastItem != lastItem) {
            //load mEndDate to mEndDate + 1 Month
        }
    }
    mPreviousLastItem = lastItem;
    mPreviousFirstitem = firstVisibleItem;
 }
}

我最终使用了 MergeCursor 并将旧光标替换为新创建的 MergeCursor。