2017-07-06 10 views
0

ListViewを使用してCalendarProviderからイベントインスタンスのリストを表示しています。最初は、Today-1MonthからToday + 1Monthまでのすべてのインスタンスを照会します。ユーザーがListViewの上または下にスクロールすると、次または前の月が読み込まれます。今では、すでにOnScrollListenerを実装しています。上下のスクロールを検出します。しかし、今私は何をすべきか分かりません。カーソルにデータを追加するにはどうすればよいですか?または、これはCursorAdapterでは不可能ですか?何らかのDTOなどを作成しなければならないのですか?ListViewを無制限にスクロールしてCalendarProviderからカーソルを移動

は、ここに私のコード

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; 
} 
} 

答えて

0

私はMergeCursorを使用して、新しく作成されたMergeCursorと古いカーソルを交換することになったです。