О приложении
Я разрабатываю приложение calendar.Want, чтобы показать monthview с горизонтальной навигацией по навигации? Это означает, что бесконечный прокручиваемый пользователь может прокручивать вправо и влево месяц до любой даты/месяца любого года. Я нашел, что ViewPager очень полезен для достижения этого. (Я действительно не знаю, какие другие используют полные методы). И нажатием кнопки ячеек даты можно увидеть детали или события, добавленные к этой дате (я не знаю, t хотите связать с календарем устройства).
О проблеме
Я могу добавить новую страницу в конец пейджера View без каких-либо проблем. Но если пользователь переместится налево, мне нужно добавить страницу в начало моего ViewPager.
. Когда я добавляю страницу в начало (индексная позиция нуля), это заменит мою текущую страницу на нулевой позиции и сможет только добавить одну страницу (новые страницы не добавляются, я не знаю почему). И после добавления страницы в нулевую позицию я не могу добавить даже добавленную страницу в конец пейджера просмотра, когда пользователь щелкает вправо и повторяет последнюю страницу. Силовое замыкание происходит с ошибкой:
java.lang.IllegalStateException: Can't change tag of fragment MyFragment{40526bb8 #2 id=0x7f070000 android:switcher:2131165184:2}: was android:switcher:2131165184:2 now android:switcher:2131165184:3
В простом предложении
Я хочу знать, как правильно добавлять страницы в начало и конец пейджера View?
код
Активность и адаптер
public class PageViewActivity extends FragmentActivity {
ViewPager pager;
MyPageAdapter pageAdapter;
ArrayList<Fragment> fragments;
int page_num = 0;
int current_page = 1;
int selected_page = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_page_view);
pager = (ViewPager) findViewById(R.id.viewpager);
fragments = getFragments();
pageAdapter = new MyPageAdapter(getSupportFragmentManager(), pager,
fragments);
pager.setAdapter(pageAdapter);
pager.setCurrentItem(2);
pager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
// setting the selected page index
selected_page = arg0;
//calling add page
addPage();
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
}
public int addPage() {
System.out.println("Add page called "+selected_page);
// checking if selected page is second last and if tru adds new page
if (selected_page >= (pageAdapter.getCount() - 1)) {
System.out.println("on first condition");
Fragment new_fragment = MyFragment.newInstance("Added to last "+ (pageAdapter.getCount() + 1));
//pageAdapter.fragments.add(pageAdapter.getCount(), new_fragment);
System.out.println("pageAdapter.getCount() : "+pageAdapter.getCount());
pageAdapter.add(pageAdapter.getCount(), new_fragment);
current_page = selected_page;
pageAdapter.notifyDataSetChanged();
System.out.println("New page added");
}else if((selected_page-1)<=0){
System.out.println("on second condition");
Fragment new_fragment = MyFragment.newInstance("Added to begning "+ (pageAdapter.getCount() + 1));
pageAdapter.add(0, new_fragment);
current_page = selected_page;
//pageAdapter.notifyDataSetChanged();
}
return pageAdapter.getCount();
}
private ArrayList<Fragment> getFragments() {
ArrayList<Fragment> fList = new ArrayList<Fragment>();
fList.add(MyFragment.newInstance("Fragment 1"));
fList.add(MyFragment.newInstance("Fragment 2"));
fList.add(MyFragment.newInstance("Fragment 3"));
fList.add(MyFragment.newInstance("Fragment 4"));
fList.add(MyFragment.newInstance("Fragment 5"));
return fList;
}
private class MyPageAdapter extends FragmentPagerAdapter {
private ArrayList<Fragment> fragments;
private ViewPager mPager;
public MyPageAdapter(FragmentManager fm, ViewPager vp,
ArrayList<Fragment> fragments) {
super(fm);
this.fragments = fragments;
this.mPager = vp;
}
public void add(int position,Fragment f){
fragments.add(position, f);
this.notifyDataSetChanged();
}
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
@Override
public int getCount() {
return this.fragments.size();
}
}
}
Мой класс фрагментов
public class MyFragment extends Fragment {
public static final String EXTRA_MESSAGE = "EXTRA_MESSAGE";
public static final MyFragment newInstance(String message)
{
MyFragment f = new MyFragment();
Bundle bdl = new Bundle(1);
bdl.putString(EXTRA_MESSAGE, message);
f.setArguments(bdl);
return f;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
String message = getArguments().getString(EXTRA_MESSAGE);
View v = inflater.inflate(R.layout.myfragment_layout, container, false);
TextView messageTextView = (TextView)v.findViewById(R.id.textView);
messageTextView.setText(message);
//return null;
return v;
}
}