2015-04-22 2 views
2

Итак, чтобы начать с того, что я ущипнул код от here, я установил названия страниц, чтобы отобразить дату, которая хорошо работает, но у меня возникают проблемы с позициями и то, что Date на самом деле отправляется в Bundle, начинается с сегодняшней даты, а позиция - 2000,«бесконечный» прокручиваемый viewpager с добавлением дней/декрементом

Я прокрутил вправо, а положение и дата переместились в 2002 году и через 2 дня после сегодняшнего дня, но PagerTitleStrip будет правильным и сказать его завтра.

То же самое происходит, если я прокручу влево, кроме его декрементированного.

Итак, мой вопрос: «Вы знаете, почему это странное поведение происходит и как я могу это исправить?»

Итак, вот код, я делаю что-то неправильно?

Кроме того, когда приложение загружает на экран ViewPager, то PagerTitleStrip будет выглядеть следующим образом (я думаю, что это то, что вызывает проблемы)

[вчера дата] [сегодняшняя дата] [завтрашняя дату]

public class MainMenuActivity extends AppCompatActivity { 

/** 
* The {@link android.support.v4.view.PagerAdapter} that will provide 
* fragments for each of the sections. We use a 
* {@link FragmentPagerAdapter} derivative, which will keep every 
* loaded fragment in memory. If this becomes too memory intensive, it 
* may be best to switch to a 
* {@link android.support.v4.app.FragmentStatePagerAdapter}. 
*/ 
BootstrapPagerAdapter mSectionsPagerAdapter; 

/** 
* The {@link ViewPager} that will host the section contents. 
*/ 
ViewPager mViewPager; 
ArrayList<Set> selected = new ArrayList<>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_menu_setup); 
    try { 
     getSupportActionBar().setDisplayShowHomeEnabled(true); 
     getSupportActionBar().setLogo(R.mipmap.ic_launcher); 
     getSupportActionBar().setDisplayUseLogoEnabled(true); 
     getSupportActionBar().setTitle("ProjectME"); 
    } catch(NullPointerException n) { 
     Log.v("nullPointerCaught", n.toString()); 
    } 


    // Create the adapter that will return a fragment for each of the three 
    // primary sections of the activity. 
    mSectionsPagerAdapter = new BootstrapPagerAdapter(getResources(), getSupportFragmentManager()); 

    // Set up the ViewPager with the sections adapter. 
    mViewPager = (ViewPager) findViewById(R.id.pager); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 
    mViewPager.setCurrentItem(2000); 

} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    if(id == R.id.action_add) { 
     Intent intent = new Intent(MainMenuActivity.this, CategoryListView.class); 
     startActivity(intent); 
    } 

    if(id == R.id.action_cal) { 
     Intent intent = new Intent(MainMenuActivity.this, CalendarView.class); 
     startActivity(intent); 
    } 

    if(id == R.id.action_copy) { 
     Toast.makeText(getApplicationContext(), "Copy has been clicked", Toast.LENGTH_SHORT).show(); 
    } 

    return super.onOptionsItemSelected(item); 
} 

public ArrayList<Set> getSelected() { 
    return selected; 
} 

public void setSelected(ArrayList<Set> selected) { 
    this.selected = selected; 
} 

public class BootstrapPagerAdapter extends FragmentPagerAdapter { 

    /** 
    * Create pager adapter 
    * 
    * @param resources 
    * @param fragmentManager 
    */ 

    public BootstrapPagerAdapter(Resources resources, FragmentManager fragmentManager) { 
     super(fragmentManager); 
    } 

    @Override 
    public int getCount() { 
     return 10000; 
    } 

    @Override 
    public int getItemPosition(Object object) { 
     return super.getItemPosition(object); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     DateTime pagerdate = DateTime.now(TimeZone.getDefault()); 
     DateTime days = pagerdate.plusDays(position - 2000); 
     return days.format("DD/MM/YYYY").toString(); 
    } 

    @Override 
    public Fragment getItem(int position) { 


     DateTime pagerdate = DateTime.now(TimeZone.getDefault()); 
     DateTime days = pagerdate.plusDays(position - 2000); 

     Bundle bundle = new Bundle(); 
     bundle.putString("date", days.format("DD/MM/YYYY").toString()); 
     bundle.putInt("position", position); 
     Log.v("date", days.format("DD/MM/YYYY").toString()); 
     Log.v("position", position + ""); 
     MainMenuView2 mainMenuView2 = new MainMenuView2(); 
     mainMenuView2.setArguments(bundle); 
     return mainMenuView2; 
    } 
} 
} 
+0

начать, для «бесконечных» вещей, которые вы должны использовать 'FragmentStatePagerAdapter' вместо' FragmentPagerAdapter' – injecteer

+0

только что добавил «FragmentStatePagerAdapter», я просмотрю документацию разработчика и посмотрю, что я могу найти – Joeliomason

+0

Я не понимаю, что вы имеете в виду под «странным поведением» – injecteer

ответ

0

реализация Adapter Курсор основе может выглядеть следующим образом:

class SwipeAdapter extends FragmentStatePagerAdapter { 

    private final Cursor cursor; 

    private final int count; 

    public SwipeAdapter(FragmentManager fm) { 
    super(fm); 
    cursor = initCursorSomehow(); 
    count = cursor.getCount(); 
    } 

    @Override 
    public int getCount() { 
    return count; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
    cursor.moveToPosition(position); 
    return cursor.getString(cursor.getColumnIndex("title")); 
    } 

    @Override 
    public Fragment getItem(int position) { 
    Bundle b = new Bundle(); 
    cursor.moveToPosition(position); 
    b.putString("someDate", cursor.getString(cursor.getColumnIndex("someDate"))); 
    b.putString("someInt", cursor.getInt(cursor.getColumnIndex("someInt"))); 
    return Fragment.instantiate(getApp(), SomeFragment.class.getName(), b); 
    } 
} 
+0

. Моя проблема в том, что когда вызывается getItem, он создает три фрагмента, а последний созданный фрагмент справа, он считает, что дата и позиция дата и начальная позиция +1, есть ли способ сделать это, чтобы создать 1 фрагмент? – Joeliomason

+0

нет, пейджер всегда разогревает n-1, n и n + 1 фрагменты. Причина: гладкий пользовательский интерфейс, прокручивая – injecteer

Смежные вопросы