TabView内的TabLayout

sub*_*com 6 android android-fragments firebase android-cardview android-recyclerview

我想在CardView中创建一个TabLayout,如下所示:

TabView内的TabLayout

在此输入图像描述

但坚持添加ViewPager适配器.

我按照从这个站点制作TabLayout的例子.

由于我使用RecyclerView,我将TabLayout和ViewPager放在myViewHolder中

public class MyViewHolder extends RecyclerView.ViewHolder {

TabLayout tabLayout;

public MyViewHolder(View itemView) {
    super(itemView);        

    tabLayout = (TabLayout) itemView.findViewById(R.id.tab_layout);
    tabLayout.addTab(tabLayout.newTab().setText("TAB 1"));
    tabLayout.addTab(tabLayout.newTab().setText("TAB 2"));
    tabLayout.addTab(tabLayout.newTab().setText("TAB 3"));
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);


    final ViewPager viewPager = (ViewPager) itemView.findViewById(R.id.pager);
    final PagerAdapter adapter = new PagerAdapter
            (getSupportFragmentManager(), tabLayout.getTabCount());
    viewPager.setAdapter(adapter);
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

         }
    });
}
}
Run Code Online (Sandbox Code Playgroud)

但是我在getSupportFragmentManager上得到"无法解析方法".

这是PagerAdapter类.

public class PagerAdapter extends FragmentStatePagerAdapter {
int mNumOfTabs;

public PagerAdapter(FragmentManager fm, int NumOfTabs) {
    super(fm);
    this.mNumOfTabs = NumOfTabs;
}

@Override
public Fragment getItem(int position) {

    switch (position) {
        case 0:
            Fragment1 tab1 = new Fragment1();
            return tab1;
        case 1:
            Fragment2 tab2 = new Fragment2();
            return tab2;
        case 2:
            Fragment3 tab3 = new Fragment3();
            return tab3;
        default:
            return null;
    }
}

@Override
public int getCount() {
    return mNumOfTabs;
}
}
Run Code Online (Sandbox Code Playgroud)

我使用FirebaseRecyclerAdapter连接到Firebase

public abstract class FirebaseRecyclerAdapter<T, VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {

Class<T> mModelClass;
protected int mModelLayout;
Class<VH> mViewHolderClass;
FirebaseArray mSnapshots;

ArrayList<HashMap<String, String>> dataList;

public FirebaseRecyclerAdapter(Class<T> modelClass, int modelLayout, Class<VH> viewHolderClass, Query ref) {
    mModelClass = modelClass;
    mModelLayout = modelLayout;
    mViewHolderClass = viewHolderClass;
    mSnapshots = new FirebaseArray(ref);

    mSnapshots.setOnChangedListener(new FirebaseArray.OnChangedListener() {
        @Override
        public void onChanged(EventType type, int index, int oldIndex) {
            switch (type) {
                case Added:
                    notifyItemInserted(index);
                    break;
                case Changed:
                    notifyItemChanged(index);
                    break;
                case Removed:
                    notifyItemRemoved(index);
                    break;
                case Moved:
                    notifyItemMoved(oldIndex, index);
                    break;
                default:
                    throw new IllegalStateException("Incomplete case statement");
            }
        }
    });
}

public FirebaseRecyclerAdapter(Class<T> modelClass, int modelLayout, Class<VH> viewHolderClass, Firebase ref) {
    this(modelClass, modelLayout, viewHolderClass, (Query) ref);
}

public void cleanup() {
    mSnapshots.cleanup();
}

@Override
public int getItemCount() {
    return mSnapshots.getCount();
}

public T getItem(int position) {
    return parseSnapshot(mSnapshots.getItem(position));
}

protected T parseSnapshot(DataSnapshot snapshot) {
    return snapshot.getValue(mModelClass);
}

public Firebase getRef(int position) { return mSnapshots.getItem(position).getRef(); }

@Override
public long getItemId(int position) {
    // http://stackoverflow.com/questions/5100071/whats-the-purpose-of-item-ids-in-android-listview-adapter
    return mSnapshots.getItem(position).getKey().hashCode();
}

@Override
public VH onCreateViewHolder(ViewGroup parent, int viewType) {
    ViewGroup view = (ViewGroup) LayoutInflater.from(parent.getContext()).inflate(mModelLayout, parent, false);
    try {
        Constructor<VH> constructor = mViewHolderClass.getConstructor(View.class);
        return constructor.newInstance(view);
    } catch (NoSuchMethodException e) {
        throw new RuntimeException(e);
    } catch (InvocationTargetException e) {
        System.out.println("cause: "+ e.getCause());
        throw new RuntimeException(e);
    } catch (InstantiationException e) {
        throw new RuntimeException(e);
    } catch (IllegalAccessException e) {
        throw new RuntimeException(e);
    }
}
@Override
public void onBindViewHolder(VH viewHolder, int position) {
    T model = getItem(position);
    populateViewHolder(viewHolder, model, position);

}
abstract protected void populateViewHolder(VH viewHolder, T model, int position);

public void setFilter(ArrayList<HashMap<String, String>> countryModels) {
    dataList = new ArrayList<>();
    dataList.addAll(countryModels);
    notifyDataSetChanged();
}
}
Run Code Online (Sandbox Code Playgroud)

请帮我解决这个问题.谢谢.

Vuc*_*cko 0

ViewHolder这是因为您从不是从支持库扩展的库中调用它FragmentActivity,因此该方法不存在于超类中。

您可以使用 Activity 的FragmentManager或以其他方式将其传递给 ViewHolder (可能是因为它是private FragmentManager fm;在构造函数中设置的私有字段)。

像这样的东西:

public class MyViewHolder extends RecyclerView.ViewHolder {

TabLayout tabLayout;
FragmentManager myFragmentManager; //beware that it's the FragmentManager from the support library

public MyViewHolder(View itemView, FragmentManager fm) {
    this.myFragmentManager = fm;
    super(itemView);
Run Code Online (Sandbox Code Playgroud)

无论您在何处创建 ViewHolder,只需传递FragmentManager类似的内容new MyViewHolder(someView, getSupportFragmentManager()),并且您必须从扩展的活动中调用它,FragmentActivity否则您将无法获得FragmentManager.

然后简单地使用而不是调用导致这一行出现问题的myFragmentManager方法:getSupportFragmentManager()

final PagerAdapter adapter = new PagerAdapter
        (getSupportFragmentManager(), tabLayout.getTabCount());
Run Code Online (Sandbox Code Playgroud)