>

Activity 가있다  2 개의 조각으로. ParentTabFragment 선언  내 Activity 에서   TabLayout 가있는 곳  그리고 ViewPager .

ParentTabFragment 에 방법이있다   addPage 라고   Activity 에서 호출됩니다 .

addPage   addFrag 라는 또 다른 방법이 있습니다  이것은 ViewPagerAdapter 에서 호출   views 만들기   ChildTabFragment 에서  동적으로.

for loop 가있다  어느 Activity 에서 실행 그래서 Fragments   customList 의 항목 수에 따라 생성됩니다. , tabs 의 양을 만들기  및 Fragments 의 페이지 .

ChildTabFragment 에서  나는 customList 를로드   tab 에서  선택 event , 내가 Tab 를 선택할 때   ParentTabFragment 에서 나는 getTabID() 를 호출   ChildTabFragment 의 방법   Tab 의 ID를 보내  내가 customList 를로드로 인해   ParentTabFragment 의 ID에 따르면 .

문제는 탭을 스 와이프하거나 선택할 때 customList 에서 중복/거짓 데이터가 생성되는 것입니다 .

나는 적당한 Id 를 얻는다  선택한 탭에서 메소드에 전달하려고하면 임의의 ID가 호출됩니다.

내 활동 수업에서 :

for (int j =0;j<it.size();j++){
            parentTabFragment.addPage(it.get(j).getTabMenuItem(), it.get(j).getTabMenuId() , selectedMenu);
        }

ParentTabFragment :

public void addPage(String pagename, String pageId, String selectedMenu) {
        Bundle bundle = new Bundle();
        bundle.putString("data", pagename);
        //bundle.putString("pageID", pageId);
        childTabFragment = new ChildTabFragment();
        childTabFragment.setArguments(bundle);
        adapter.addFrag(childTabFragment, pagename, pageId);
        adapter.notifyDataSetChanged();
        if (selectedMenu == null) {
            viewPager.setCurrentItem(0);
        } else {
            for (int i = 0; i < tabLayout.getTabCount(); i++) {
                if (tabLayout.getTabAt(i).getText().equals(selectedMenu)) {
                    viewPager.setCurrentItem(i);
                }
            }
        }
        if (adapter.getCount() > 0) tabLayout.setupWithViewPager(viewPager);
        setupTabLayout();
    }
    public void setupTabLayout() {
        selectedTabPosition = viewPager.getCurrentItem();
        for (int i = 0; i < tabLayout.getTabCount(); i++) {
            tabLayout.getTabAt(i).setCustomView(adapter.getTabView(i));
        }
    }

ChildTabFragment :

public class ChildTabFragment extends Fragment {
    String childname;
    int menuItemId;
    TextView textViewChildName, txtViewItemId;
    ListView childTabMenuList;
    private ArrayList<ChildTabMenu_POJO> childTabMenuPojoList = new ArrayList<>();
    private ListView listView;
    private ChildTabMenuAdapter childTabMenuAdapter;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.child_tab_fragment, container, false);
        Bundle bundle = getArguments();
        childname = bundle.getString("data");
        getIDs(view); 
        return view;
    }
    private void getIDs(View view) { 
        childTabMenuList = (ListView) view.findViewById(R.id.childTabMenuList); 
        loadChildMenu();
    }
    private void loadChildMenu(menuItemId) { 
        ChildTabMenu_POJO menu_pojo4 = new ChildTabMenu_POJO(String.valueOf(menuItemId), "4");  
        childTabMenuPojoList.add(menu_pojo4);
        childTabMenuAdapter = new ChildTabMenuAdapter(childTabMenuPojoList, getActivity());
        childTabMenuList.setAdapter(childTabMenuAdapter);
    }
    public void getTabID(int tabId) {
        menuItemId = tabId; 
        Log.e("updatefrag", String.valueOf(menuItemId)); 
    }
}

ViewPagerAdapter :

public class ViewPagerAdapter extends FragmentStatePagerAdapter {
    private final ArrayList<Fragment> mFragmentList = new ArrayList<>();
    private final ArrayList<Adapter_POJO> mFragmentTitleList = new ArrayList<>();
    Context context;
    ViewPager viewPager;
    TabLayout tabLayout;
    Adapter_POJO adapter_pojo;
    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 int getItemCount() {
        return mFragmentTitleList.size();
    }

    public void addFrag(Fragment fragment, String title, String pageId) {
        mFragmentList.add(fragment);
        adapter_pojo = new Adapter_POJO(title,pageId);
        mFragmentTitleList.add(adapter_pojo);
    }
    public View getTabView(final int position) {
        View view = LayoutInflater.from(context).inflate(R.layout.view_pager_adapter_layout, null);
        TextView tabItemName = (TextView) view.findViewById(R.id.textViewTabItemName);
        tabItemName.setText(mFragmentTitleList.get(position).adapterMenuItem);
        tabItemName.setTextColor(context.getResources().getColor(android.R.color.background_light));
        return view;
    }
    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }
    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position).adapterMenuItem;
    }
    public String getPageId(int position){
        return mFragmentTitleList.get(position).adapterMenuId;
    }
}


  • 답변 # 1

    질문을 이해하면 인수가있는 조각을 만들기 위해 newInstance 생성자를 만들어야합니다.

    public static ChildTabFragment newInstance(int page, String title) {
            FirstFragment fragmentFirst = new FirstFragment();
            Bundle args = new Bundle();
            args.putInt("someInt", page);
            args.putString("someTitle", title);
            fragmentFirst.setArguments(args);
            return fragmentFirst;
        }
    
    

    ChildTabFragment에 전달 된 인수를 기반으로 인스턴스 변수를 저장하십시오.

    @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            page = getArguments().getInt("someInt", 0);
            title = getArguments().getString("someTitle");
        }
    
    

    이제 onCreateView 에서 뷰를 업데이트하십시오.  방법

    TextView tvLabel = (TextView) view.findViewById(R.id.tvLabel);
            tvLabel.setText(page + " -- " + title);
    
    

    그리고 가장 중요한 것은 ChildTabFragment 를 반환합니다.  귀하의 ViewPagerAdapter 에서 해당 페이지에 표시  이렇게요.

    @Override
        public Fragment getItem(int position) {
            return ChildTabFragment.newInstance(position,"page "+String.valueOf(position));
        }
    
    

관련 자료

  • 이전 python - 여러 nparrange (numpy)
  • 다음 java - Tomcat jdbc 풀에는 연결 재사용에 대한 몇 가지 다른 동작이 있습니다