安卓viewpager:加入时,奇怪的错误/删除页面 [英] Android viewpager: weird bug when adding/removing page

查看:240
本文介绍了安卓viewpager:加入时,奇怪的错误/删除页面的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不知道该如何解释这一点,所以我上传的的Youtube视频。 一切工作正常,当我加入的网页。同时删除页面的作品,如果我开始在列表的末尾并逐步移动到第一页,但如果我删除某个0结束的,之后我添加页面,我得到一个空白页。创建片段,但认为并非如此。

I dont know how to explain this, so i uploaded a video in Youtube. Everything works fine when i am adding pages. Also removing page works if i start at the end of the list and move progressively to the first page, but if i remove somewhere between 0-end and after that i add page, i am getting a blank page. Fragment is created but view is not.

是不是有什么毛病我code?是的,我已经看到了<一个href="http://stackoverflow.com/questions/7263291/viewpager-pageradapter-not-updating-the-view">this问题,返回 POSITION_NONE 是不是一种选择,因为应用程序我正在从网络下载内容和列表视图显示,所以重建片段每次当用户删除的网页没有很有效。

Is there something wrong with my code? Yes, i have seen this question, returning POSITION_NONE is not an option, because application i am working on downloads content from web and displays it in listview, so recreating fragments everytime when user removes page is not very effective.

Button click:            Result:

Add page                 [Fragment 1]
Add page                 [Fragment 1][Fragment 2]
Add page                 [Fragment 1][Fragment 2][Fragment 3]
remove page(position2)   [Fragment 1][Fragment 2]
remove page(position1)   [Fragment 1]
Add page                 [Fragment 1][Fragment 2]
remove page(position1)   [Fragment 1]
remove page(position0)    ---No pages---


Add page                 [Fragment 0]
Add page                 [Fragment 0][Fragment 1]
Add page                 [Fragment 0][Fragment 1][Fragment 2]
add page                 [Fragment 0][Fragment 1][Fragment 2][fragment 3]
remove page(position2)   [Fragment 0][Fragment 1][Fragment 3]
add page                 [Fragment 0][Fragment 1][Fragment 3][Blank page]
remove page(position0)   [Fragment 1][Fragment 3][Fragment 3][Blank page]

MainActivity.class

MainActivity.class

    public class MainActivity extends FragmentActivity {
    private static final String TAG = "MainActivity";
    private ViewPager mViewpager;
    private ArrayList<Fragment> fragmentslist;
    private SectionsPagerAdapter mPagerAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        fragmentslist = new ArrayList<Fragment>();
        mPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
        mViewpager = (ViewPager)findViewById(R.id.pager);
        mViewpager.setAdapter(mPagerAdapter);
        mViewpager.setOffscreenPageLimit(4);
    }

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

    @Override
    public boolean onOptionsItemSelected (MenuItem item){
        switch(item.getItemId()){
        case R.id.menu_add_page:
            Bundle bundle = new Bundle();
            bundle.putInt("Position", fragmentslist.size());
            fragment frag = new fragment();
            frag.setArguments(bundle);
            fragmentslist.add(frag);
            mPagerAdapter.notifyDataSetChanged();
            mViewpager.setCurrentItem(fragmentslist.indexOf(frag));
            Log.i(TAG, "Add fragment");
            break;
        case R.id.menu_remove_page:
            if(fragmentslist.size() > 0){
                mPagerAdapter.removeItem(mViewpager.getCurrentItem());
            }
            Log.i(TAG, "Removing page " + mViewpager.getCurrentItem());
            break;
        }
        return true;
    }


    public class SectionsPagerAdapter extends FragmentPagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            return fragmentslist.get(position);
        }

        @Override
        public int getCount() {
            return fragmentslist.size();
        }

        @Override
        public int getItemPosition(Object object){
            int index = fragmentslist.indexOf(object);
            if(index != -1){
                Log.i(TAG, "Position: " + index);
                return index;
            }
            else{
                Log.i(TAG, "POSITION_NONE");
                return POSITION_NONE;
            }
        }

        public void removeItem(int position){
            Fragment fragment = (Fragment)fragmentslist.get(position);
            getSupportFragmentManager().beginTransaction().remove(fragment).commit();
            fragmentslist.remove(position);
            notifyDataSetChanged();
        }

    }


    public static class fragment extends Fragment{
        private String colors[] = {"#FF0000", "#00FF00", "#FFFF00", "#FF6600"};

        public View onCreateView(LayoutInflater inflater, ViewGroup root, Bundle savedInstanceState){
            View mView = inflater.inflate(R.layout.fragment_layout, null);
            RelativeLayout layout = (RelativeLayout)mView.findViewById(R.id.relativelayout);
            TextView text = (TextView)mView.findViewById(R.id.textView1);

            int position = this.getArguments().getInt("Position");
            text.setText("Page: " + position);
            layout.setBackgroundColor(Color.parseColor(colors[position]));
            Log.i("fragment", "Page: " + position + " view created");
            return mView;
        }
    }

}

activity_main.xml:

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</android.support.v4.view.ViewPager>

fragment_layout.xml

fragment_layout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" 
android:id="@+id/relativelayout">

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:text="Large Text"
    android:textSize="40sp" />

推荐答案

尝试添加或移除列表中的项目之前做mViewpager.setAdapter(空)。然后,将适配器设置回mPagerAdapter。似乎ViewPager不是设计来处理插入或缺失,除了从列表的末尾。

Try doing mViewpager.setAdapter(null) before adding or removing items from the list. Afterwards, set the adapter back to mPagerAdapter. It appears that ViewPager was not designed to handle insertions or deletions except from the end of the list.

我有工作样本code,可能对你有用。看看<一href="http://stackoverflow.com/questions/13664155/dynamically-add-and-remove-view-to-viewpager">ViewPager样品。

I have working sample code that might be useful to you. Take a look at ViewPager sample.

这篇关于安卓viewpager:加入时,奇怪的错误/删除页面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆