【问题标题】:Unable to replace fragments inside viewpager无法替换 viewpager 中的片段
【发布时间】:2016-09-09 07:28:15
【问题描述】:

在我的代码中,我有一个带有 5 个片段的 viewpager。当我尝试用新片段替换 viewpager 中的第一个片段时。旧版本仍在加载中。

我无法用新片段替换旧片段。这是我的代码。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    viewPager.getAdapter().notifyDataSetChanged();
    if (id == R.id.menu_leave_raise_req) {
       // adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFrag(new ActionItemLeaveFragment("0"), "ONE");
        adapter.addFrag(new TwoFragment(), "TWO");
        adapter.addFrag(new ThreeFragment(), "THREE");
        adapter.addFrag(new FourFragment(), "FOUR");
        adapter.addFrag(new FifthFragment(), "FIVE");
        viewPager.setAdapter(adapter);
     customlayout();
        return true;
    } else if (id == R.id.menu_leave_apply_aprove) {

        //adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFrag(new ActionItemLeaveFragment("2"), "ONE");
        adapter.addFrag(new TwoFragment(), "TWO");
        adapter.addFrag(new ThreeFragment(), "THREE");
        adapter.addFrag(new FourFragment(), "FOUR");
        adapter.addFrag(new FifthFragment(), "FIVE");
        viewPager.setAdapter(adapter);
      customlayout();

        return true;
    } else if (id == R.id.menu_leave_lev_bal) {


   /*     getSupportFragmentManager().beginTransaction()
                .replace(R.id.viewpager, new TodayLeaveStatusFragment("0"))
                .commit();
        customlayout();*/

        //adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFrag(new TodayLeaveStatusFragment("0"), "ONE");
        adapter.addFrag(new TwoFragment(), "TWO");
        adapter.addFrag(new ThreeFragment(), "THREE");
        adapter.addFrag(new FourFragment(), "FOUR");
        adapter.addFrag(new FifthFragment(), "FIVE");
        viewPager.setAdapter(adapter);
        adapter.notifyDataSetChanged();
        customlayout();

        return true;
    } else if (id == R.id.attendance) {

        // Intent intent=new Intent(Levdetail.this, Attendance.class);
        // startActivity(intent);

        return true;
    } else if (id == R.id.leave_apply) {

        //Intent intent=new Intent(Levdetail.this, LeaveApply.class);
        // startActivity(intent);

        return true;
    }

    //viewPager.getAdapter().notifyDataSetChanged();

    return super.onOptionsItemSelected(item);
}

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


private void customlayout() {
    int[] tabIcons = {
            R.drawable.one,
            R.drawable.two,
            R.drawable.three,
            R.drawable.four,
            R.drawable.five

    };
    String[] notifications = {"10", "21", "52", "30", "37"};
    String[] titleName = {"0", "1", "2", "3", "4"};


    for (int i = 0; i < tabIcons.length; i++) {
        View v = LayoutInflater.from(this).inflate(R.layout.sample, null);

        ImageView img = (ImageView) v.findViewById(R.id.img_header);
        img.setImageResource(tabIcons[i]);

        TextView tv = (TextView) v.findViewById(R.id.notifications);
        tv.setText(notifications[i]);

        TextView title = (TextView) v.findViewById(R.id.title);
        title.setText(titleName[i]);
        title.setSelected(true);

        v.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        System.out.println("count::" + tabIcons[i]);
        tabLayout.getTabAt(i).setCustomView(v);

    }
}


private void setupViewPager(ViewPager viewPager) {

    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFrag(new ActionItemLeaveFragment("0"), "1");
    adapter.addFrag(new TwoFragment(), "2");
    adapter.addFrag(new ThreeFragment(), "3");
    adapter.addFrag(new FourFragment(), "4");
    adapter.addFrag(new FifthFragment(), "5");
    viewPager.setAdapter(adapter);
}


class ViewPagerAdapter extends FragmentPagerAdapter {

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        FragmentManager manager = ((Fragment)object).getFragmentManager();
        FragmentTransaction trans = manager.beginTransaction();
        trans.remove((Fragment)object);
        trans.commit();
    }


    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

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

  @Override
    public int getItemPosition(Object object) {

        return POSITION_NONE;
    }

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

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

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

@Override
public void onBackPressed() {
    finish();
}

任何帮助都应该对我有很大的帮助。

【问题讨论】:

  • 是新的重叠旧的还是滚动上没有发生任何事情?
  • 新的永远不会被调用。旧的正在被调用。
  • 您要在哪个事件上更改片段?

标签: android android-layout android-fragments android-viewpager fragment


【解决方案1】:

每次修改适配器中的数据时,都应该调用

adapter.notifyDataSetChanged();

要进行更改,但您只能在其中一个 if/else 分支中调用它。 尝试在 if/else 块的末尾调用此方法。

【讨论】:

    【解决方案2】:

    要在片段之间切换,您必须调用:

    viewPager.setCurrentItem(position)
    

    position 是你的 mFragmentList 中的位置片段(我看不到在哪里声明)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      相关资源
      最近更新 更多