标签的位置在删除时不会更新

时间:2018-02-21 07:32:25

标签: java android android-fragments android-viewpager

我正在使用动态标签创建应用程序。我创建的标签可以通过单击按钮添加标签,并且可以从后面删除。但是当我尝试删除第一个选项卡时,它会在删除第一个选项卡后被删除,并尝试删除最后一个选项卡,它会因为越界异常而强行关闭。

我弄明白了这个问题。假设有4个TABS,当我试图删除第一个选项卡时,第0个位置选项卡(TAB 1)被删除,现在当我尝试删除最后一个选项卡时说现在是第4个TAB选项卡(现在假设为第2个位置)它崩溃了,就像我试图在删除时记录位置显示位置为第3位。

ALl从viewPage适配器完成删除。代码是:

public class ViewPagerAdapter extends FragmentStatePagerAdapter {
    private final ArrayList<Fragment> mFragmentList = new ArrayList<>();
    private final ArrayList<String> mFragmentTitleList = new ArrayList<>();
    Context context;
    ViewPager viewPager;
    TabLayout tabLayout;
    int selectedTabPosition;
    private boolean doNotifyDataSetChangedOnce = false;
    public ViewPagerAdapter(FragmentManager manager, Context context, ViewPager viewPager,
                            TabLayout tabLayout) {
        super(manager);
        this.context = context;
        this.viewPager = viewPager;
        this.tabLayout = tabLayout;
    }

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

    @Override
    public int getCount() {
        if (doNotifyDataSetChangedOnce) {
            doNotifyDataSetChangedOnce = false;
            notifyDataSetChanged();
        }
        return mFragmentList.size();
    }

    public void addFrag(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    public void removeFrag(int position) {
        Log.e("REMOVING POSITION ",String.valueOf(position));
        Fragment fragment = mFragmentList.get(position);
        mFragmentList.remove(fragment);
        mFragmentTitleList.remove(position);
        Log.e("mFragmentList_REMOVE",String.valueOf(mFragmentList.size()));
        Log.e("TitleList_REMOVE",String.valueOf(mFragmentTitleList.size()));
        removeTab(position);
        //destroyFragmentView(viewPager, position, fragment);
        notifyDataSetChanged();
    }

    public View getTabView(final int position) {
        Log.e("mFragmentList",String.valueOf(mFragmentList.size()));
        Log.e("TitleList",String.valueOf(mFragmentTitleList.size()));
        View view = LayoutInflater.from(context).inflate(R.layout.custom_tab_item, null);
        TextView tabItemName = (TextView) view.findViewById(R.id.textViewTabItemName);
        CircleImageView tabItemAvatar =
            (CircleImageView) view.findViewById(R.id.imageViewTabItemAvatar);
        ImageButton remove = (ImageButton) view.findViewById(R.id.imageButtonRemove);
        Log.e("getCount()-MAIN",String.valueOf(getCount()));
        if(getCount() == 1){
            remove.setVisibility(View.INVISIBLE);
        }
        else{
            remove.setVisibility(View.VISIBLE);
        }
        ImageButton add = (ImageButton) view.findViewById(R.id.imageButtonAdd);
        remove.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    Log.d("Remove", "Remove");
                    if(getCount() != 1){
                        removeFrag(position);
                    }
                    else{
                       // Toast.makeText("Atleast One Tab is requied")
                    }

            }
        });
        add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e("getCount()-ADD",String.valueOf(getCount()));
                View view = LayoutInflater.from(context).inflate(R.layout.custom_tab_item, null);
                ImageButton remove = (ImageButton) view.findViewById(R.id.imageButtonRemove);
                if(getCount() == 1){
                    remove.setVisibility(View.INVISIBLE);
                }
                else{
                    remove.setVisibility(View.VISIBLE);
                }
                Bundle bundle = new Bundle();
                bundle.putString("data", "POS"+position);
                FragmentChild fragmentChild = new FragmentChild();
                fragmentChild.setArguments(bundle);
                addFrag(fragmentChild, "POS"+position);
                notifyDataSetChanged();
                if (getCount() > 0) tabLayout.setupWithViewPager(viewPager);

                viewPager.setCurrentItem(getCount() - 1);
                setupTabLayout();
            }
        });

        tabItemName.setText(mFragmentTitleList.get(position));
        tabItemName.setTextColor(context.getResources().getColor(android.R.color.background_light));
        tabItemAvatar.setImageResource(R.drawable.boy);
        return view;
    }
    public void setupTabLayout() {
        selectedTabPosition = viewPager.getCurrentItem();
        for (int i = 0; i < tabLayout.getTabCount(); i++) {
            tabLayout.getTabAt(i).setCustomView(getTabView(i));
        }
    }
    public void destroyFragmentView(ViewGroup container, int position, Object object) {
        FragmentManager manager = ((Fragment) object).getFragmentManager();
        FragmentTransaction trans = manager.beginTransaction();
        trans.remove((Fragment) object);
        trans.commit();
        notifyDataSetChanged();
    }

    public void removeTab(int position) {
        if (tabLayout.getChildCount() > 0 && tabLayout!=null) {
            tabLayout.removeTabAt(position);
        }
        viewPager.setAdapter(this);
        notifyDataSetChanged();
    }

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }
    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

TAB STYLE: enter image description here

请帮我解决这个问题!我在这里做错了什么。我使用了一个教程并完全按照解释完成。

最终找到解决方案

if (getCount() > 0) tabLayout.setupWithViewPager(viewPager);

        viewPager.setCurrentItem(getCount() - 1);
        setupTabLayout();

将这段代码添加到removeFrag函数!

public void removeFrag(int position) {
        removeTab(position);
        Log.e("REMOVING POSITION ",String.valueOf(position));
        Fragment fragment = mFragmentList.get(position);
        mFragmentList.remove(fragment);
        mFragmentTitleList.remove(position);
        Log.e("mFragmentList_REMOVE",String.valueOf(mFragmentList.size()));
        Log.e("TitleList_REMOVE",String.valueOf(mFragmentTitleList.size()));
        //destroyFragmentView(viewPager, position, fragment);
        notifyDataSetChanged();
        if (getCount() > 0) tabLayout.setupWithViewPager(viewPager);

        viewPager.setCurrentItem(getCount() - 1);
        setupTabLayout();
    }

3 个答案:

答案 0 :(得分:0)

使用此功能删除..这是因为: -

  

删除标签后,getView(int position)的位置不会更新。所以请像这样写一下删除(imageButton)的点击监听器功能。

remove.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
                Log.d("Remove", "Remove");
                if(getCount() != 1){

                    remove.setEnabled(false); // it here..
                    removeFrag(position);

                }
                else{
                   // Toast.makeText("Atleast One Tab is requied")
                }

        }
    });

  public void removeFrag(int position) {
    Log.e("REMOVING POSITION ",String.valueOf(position));
    Fragment fragment = mFragmentList.get(position);
    mFragmentList.remove(fragment);
    mFragmentTitleList.remove(position);
    Log.e("mFragmentList_REMOVE",String.valueOf(mFragmentList.size()));
    Log.e("TitleList_REMOVE",String.valueOf(mFragmentTitleList.size()));
    removeTab(position);
    //destroyFragmentView(viewPager, position, fragment);
    notifyDataSetChanged();

    setupTabLayout(); // do the setup of tablayout after removing
}

编辑还有一件事不要忘记禁用按钮..因为如果用户连续两次点击按钮......闪光灯可能会崩溃..

remove.setEnabled(false); 再次在getView(int position)处再次禁用和启用..

getView(int position)
 {
   ........
   remove.setEnabled(true); //enable
     } 

更新: -

public void removeTab(int position) {
    if (tabLayout.getChildCount() > 0 && tabLayout!=null) {
        tabLayout.removeTabAt(position);
        //notifyDataSetChanged(); //notify here
        removeTabPage(position);

    }
    //viewPager.setAdapter(this);

}
  

您还需要删除页面..

public void removeTabPage(int position) {
if (!mFragmentList.isEmpty() && position<mFragmentList.size()) {
      mFragmentList.remove(position);
      notifyDataSetChanged();
}
}

答案 1 :(得分:0)

public class ViewPagerAdapter extends FragmentStatePagerAdapter {
    private final ArrayList<Fragment> mFragmentList = new ArrayList<>();
    private final ArrayList<String> mFragmentTitleList = new ArrayList<>();
    Context context;
    ViewPager viewPager;
    TabLayout tabLayout;

    public ViewPagerAdapter(FragmentManager manager, Context context, ViewPager viewPager,
                            TabLayout tabLayout) {
        super(manager);
        this.context = context;
        this.viewPager = viewPager;
        this.tabLayout = tabLayout;
    }

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

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

    public void addFrag(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    public void removeFrag(int position) {
        removeTab(position);
        Fragment fragment = mFragmentList.get(position);
        mFragmentList.remove(fragment);
        mFragmentTitleList.remove(position);
        notifyDataSetChanged();
        viewPager.setAdapter(this);
    }

    public View getTabView(final int position) {
        View view = LayoutInflater.from(context).inflate(R.layout.custom_tab_item, null);
        TextView tabItemName = (TextView) view.findViewById(R.id.textViewTabItemName);
        CircleImageView tabItemAvatar =
                (CircleImageView) view.findViewById(R.id.imageViewTabItemAvatar);
        ImageButton remove = (ImageButton) view.findViewById(R.id.imageButtonRemove);
        remove.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("Remove", "Remove");
                removeFrag(position);
            }
        });

        tabItemName.setText(mFragmentTitleList.get(position));
        tabItemName.setTextColor(context.getResources().getColor(android.R.color.background_light));

        switch (mFragmentTitleList.get(position)) {
            case "Gaiduk":
                tabItemAvatar.setImageResource(R.drawable.gaiduk);
                break;
            case "Nguyen":
                tabItemAvatar.setImageResource(R.drawable.avatar);
                break;
            case "Balakin":
                tabItemAvatar.setImageResource(R.drawable.balakin);
                break;
            case "Golovin":
                tabItemAvatar.setImageResource(R.drawable.golovin);
                break;
            case "Ovcharov":
                tabItemAvatar.setImageResource(R.drawable.ovcharov);
                break;
            case "Solovienko":
                tabItemAvatar.setImageResource(R.drawable.solovei);
                break;
            default:
                tabItemAvatar.setImageResource(R.drawable.boy);
                break;
        }

        return view;
    }



    public void removeTab(int position) {
        if (tabLayout.getChildCount() > 0) {
            tabLayout.removeTabAt(position);
        }
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

答案 2 :(得分:0)

添加removeFrag功能为:

  public void removeFrag(int position) {
        removeTab(position);
        Log.e("REMOVING POSITION ",String.valueOf(position));
        Fragment fragment = mFragmentList.get(position);
        mFragmentList.remove(fragment);
        mFragmentTitleList.remove(position);
        Log.e("mFragmentList_REMOVE",String.valueOf(mFragmentList.size()));
        Log.e("TitleList_REMOVE",String.valueOf(mFragmentTitleList.size()));
        //destroyFragmentView(viewPager, position, fragment);
        notifyDataSetChanged();
        if (getCount() > 0) tabLayout.setupWithViewPager(viewPager);

        viewPager.setCurrentItem(getCount() - 1);
        setupTabLayout();
    }