向android gallery适配器动态添加视图数据

向android gallery适配器动态添加视图数据,android,android-gallery,galleryview,Android,Android Gallery,Galleryview,我正在尝试使用Gallery小部件创建日历。我有一个monthview类,它负责创建特定月份的视图。我的MonthGallery类使用monthview作为它的子视图,而我的monthview为MonthGallery创建monthview。我遇到的问题是,当用户滚动或切换到上个月或下个月时,试图用上个月和下个月更新适配器。我使用gallery onItemSelectedListener中给出的位置,根据此位置为适配器的前后添加月份。例如: OnItemSelectedListener mGa

我正在尝试使用Gallery小部件创建日历。我有一个monthview类,它负责创建特定月份的视图。我的MonthGallery类使用monthview作为它的子视图,而我的monthview为MonthGallery创建monthview。我遇到的问题是,当用户滚动或切换到上个月或下个月时,试图用上个月和下个月更新适配器。我使用gallery onItemSelectedListener中给出的位置,根据此位置为适配器的前后添加月份。例如:

OnItemSelectedListener mGalleryOnItemSelectedListener = new OnItemSelectedListener() {

    @Override
    public void onItemSelected(AdapterView<?> adapterview, View view, int position, long id) {

        MonthView mv = (MonthView) view;
        int month = mv.getMonth();
        int year = mv.getYear();
        updateMonthBar(month, year);


        if ((position + 1) == mMonthViewGallery.getCount()) {
            if (Calendar.DECEMBER == month) {
                mMonthViewAdapter.addView(Calendar.JANUARY, year + 1);
            } else {
                mMonthViewAdapter.addView(month + 1, year);
            }
            mMonthViewGallery.setSelection(position);
        }

        if (0 == position) {

            if (Calendar.JANUARY == month) {
                mMonthViewAdapter.addViewToFront(Calendar.DECEMBER, year - 1);
            } else {
                mMonthViewAdapter.addViewToFront(month - 1, year);
            }
            mMonthViewGallery.setSelection(1);
        }
    }
OnItemSelectedListener mGalleryOnItemSelectedListener=新建OnItemSelectedListener(){
@凌驾
已选择公共位置(AdapterView AdapterView、视图视图、整型位置、长id){
MonthView mv=(MonthView)视图;
int month=mv.getMonth();
int year=mv.getYear();
updateMonthBar(月、年);
如果((位置+1)=mMonthViewGallery.getCount()){
如果(日历12月==月份){
AmmonthViewAdapter.addView(日历:1月1日,年份+1);
}否则{
AmmonthViewAdapter.addView(月+1,年);
}
MonthViewGallery.setSelection(位置);
}
如果(0==位置){
如果(日历1月==月份){
AmmonthViewAdapter.addViewToFront(日历,第1年12月);
}否则{
AmnthViewAdapter.addViewToFront(第1个月,第1年);
}
AmmonthViewGallery.setSelection(1);
}
}
问题
一旦用户滚动到另一个月,然后尝试滚动到第一个月,gallery不会自动捕捉到下一个选择。在适配器中,当调用addView(int month,int year)时,它将调用notifyDataSetChanged(),以便用上一个月或下一个月更新gallery,但这似乎会导致意外的结果在缓慢滚动时“抓拍”。只是不知道如何构造它,以便滚动平滑

编辑

我现在正在使用Gallery.setCallbackDuringFling(false),但是有没有办法在滚动Gallery时禁用onitemselected回调,然后在滚动完成后调用onitemselected()。

调用addView()时调用notifyDatasetChanged()可以保证吗

我想,你可以检查一下

我过去常常在触摸适配器内的视图时立即调用notifyDatasetChanged()

onScroll()中删除了一行


是的,在addView()和addViewToFront()中,我都调用notifyDatasetChanged()来更新图库。当您在onclicklistener中说触摸视图时?是的,在我的情况下,我通常使用刷新按钮调用notifyDatasetChanged()。我猜您的情况是,(图库中的视图)的onDraw()当它出现在屏幕上时调用,然后捕捉滚动。另外,我建议,在类似adapterView的gallery中,不要修改adapterView中的视图,只需修改与adapter连接的“数据”,并调用notifyDatasetChanged(),然后使用getView()自动更改视图。我使用这种方式,根本没有prolem。
postDelayed(mDisableSuppressSelectionChangedRunnable, SCROLL_TO_FLING_UNCERTAINTY_TIMEOUT);