具有自定义视图的Tablayout在23.4.0设计库中损坏

我将tablayout设置为我的viewpager。 但是当我使用notifyDataSetChanged然后它删除我的自定义视图并显示默认标题视图我的代码

 ViewPager viewPager = findView(R.id.view_pager);
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager(), getResources(), getFragments());
    viewPager.setAdapter(adapter);

    tabs.setupWithViewPager(viewPager);
    for (int i = 0; i < tabs.getTabCount(); i++) {
        TabLayout.Tab tab = tabs.getTabAt(i);
        tab.setCustomView(getTabView(i));

    }
    t.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            adapter.notifyDataSetChanged();
        }
    });


   public View getTabView(int position) {
    View v = LayoutInflater.from(this).inflate(R.layout.pager_tab, null);
    RelativeLayout linearLayout = (RelativeLayout) v.findViewById(R.id.view);



    return v;
}

所以它的工作正常,但是当我调用adapter.notifyDataSetChanged(); 然后我的tablayout不显示customview,我已经添加prev。 它只显示默认标题..这个相同的代码工作,如果我使用编译“com.android.support:design:23.1.1”

但如果我改变这个更新的版本,这是行不通的,请任何人可以帮助我,我试着这个,但havnt得到ans或任何其他替代库或方法,我可以在标签视图中添加customView


这可能是一个错误! 而且我仍然在最新的25.2.0支持SDK上面对这个问题。

默认情况下,当viewpager更新时, tablayout被分配自动刷新 。 这可以通过关闭下面的代码中的自动刷新来解决(解决方法)

viewPager = (ViewPager) findViewById(R.id.viewpager);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);

 setupViewPager(viewPager);
tabLayout.setupWithViewPager(viewPager,false); // Do like this to disable auto refresh of tabs

我想我找到了一种解决方案:听取布局更改,如果customView为null,请重新设置它:

viewPager.addOnLayoutChangeListener(new ViewPager.OnLayoutChangeListener() {
  @Override
  public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
      for (int i = 0; i < tabLayout.getTabCount(); i++) {
          if (tabLayout.getTabAt(i).getCustomView() == null) {
              tabLayout.getTabAt(i).setCustomView(tabs[i]);
          }
      }
  }
}

为了在选项卡创建或重新创建时设置自定义视图,我们需要在发生这种情况时进行回调。
在这种情况下,类TabLayout不允许调用监听器,但它暴露了方法TabLayout.newTab()

创建一个从TabLayout扩展并覆盖newTab() ,如下所示。

public class TabLayoutWithCustomTabView extends TabLayout {
    public TabLayoutWithCustomTabView(Context context) {
        super(context);
    }

    public TabLayoutWithCustomTabView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public TabLayoutWithCustomTabView(Context context, AttributeSet attrs,
                                      int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @NonNull
    @Override
    public Tab newTab() {
        final Tab tab = super.newTab();
        tab.setCustomView(inflate(getContext(), R.layout.custom_layout, null));
        return tab;
    }
}

在你的布局中,使用TabLayout的新类。

<com.example.TabLayoutWithCustomTabView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        ... />
链接地址: http://www.djcxy.com/p/91817.html

上一篇: Tablayout with Custom view Broken on 23.4.0 design lib

下一篇: How to Prove Immutabiltiy of String in C#?