0

我在我的活动中的工具栏中设置了微调器。 在我的活动中,我有一个FragmentPagerAdapter,我用一个片段的newInstance填充了五个Pages。 如何在我将其更改为碎片后获得我的微调器的价值。我正在使用此微调器在RecyclerView中设置我在片段页面中的单/多选模式。 我知道如何在我的活动中获得价值甚至将其传递到FragmentPagerAdapter,但我的问题是如果我更改它,因为它在我的RecyclerView中生效,我必须重新加载活动。从活动中获取微调器值到我的适配器中

我的动态

 @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_pattern_selector); 
     Intent intent = getIntent(); 
     patternImages = intent.getParcelableArrayListExtra(PATTERN_IMAGES); 
     patternSelectedMode = intent.getIntExtra(PATTERN_SELECTED_MODE, 0); 
     titles = getResources().getStringArray(R.array.tabs_pattern_title); 
//  spinnerItems = getResources().getStringArray(R.array.spinner_pattern_selector); 
     setUpPagerAdapter(); 
     setUpToolbar(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     getMenuInflater().inflate(R.menu.menu_pattern_selector, menu); 
     return super.onCreateOptionsMenu(menu); 
    } 

    @Override 
    protected void onPostCreate(Bundle savedInstanceState) { 

     super.onPostCreate(savedInstanceState); 
     View mainContent = findViewById(R.id.view_pager_container); 
     if (mainContent != null) { 
      mainContent.setAlpha(0); 
      mainContent.animate().alpha(1).setDuration(MAIN_CONTENT_FADE_IN_DURATION); 
     } else { 
      Log.d(TAG, "No view with ID main_content to fade in."); 
     } 
    } 

    private void setUpPagerAdapter() { 

     patternsPagerAdapter = new PatternsPagerAdapter(getSupportFragmentManager(), this); 
     for (int i = 0; i < titles.length; i++) { 
      switch (i) { 
       case 0: 
        minIndex = 0; 
        maxIndex = 3; 
        fragmentTitle = titles[i]; 
        break; 
       case 1: 
        minIndex = 3; 
        maxIndex = 50; 
        fragmentTitle = titles[i]; 
        break; 
       case 2: 
        minIndex = 50; 
        maxIndex = 60; 
        fragmentTitle = titles[i]; 
        break; 
       case 3: 
        minIndex = 60; 
        maxIndex = 86; 
        fragmentTitle = titles[i]; 
        break; 
       case 4: 
        minIndex = 0; 
        maxIndex = 0; 
        fragmentTitle = titles[i]; 
        break; 
      } 
      Bundle bundle = new Bundle(); 
      bundle.putInt(MIN_NUMBERS, minIndex); 
      bundle.putInt(MAX_NUMBERS, maxIndex); 
      bundle.putInt(PATTERN_SELECTED_MODE, patternSelectedMode); 
      bundle.putString(TITLE, fragmentTitle); 
      patternsPagerAdapter.addFragment(FragmentCommonPatterns.newInstance(minIndex, maxIndex, fragmentTitle, patternSelectedMode)); 
     } 
     viewPager = (ViewPager) findViewById(R.id.view_pager_container); 
     viewPager.setAdapter(patternsPagerAdapter); 
     tabLayout = (TabLayout) findViewById(R.id.pattern_tab_layout); 
     tabLayout.setupWithViewPager(viewPager); 
     tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 

      //TODO Check if I need this 
      @Override 
      public void onTabSelected(TabLayout.Tab tab) { 

       patternsPagerAdapter.getItem(tab.getPosition()); 
//    System.out.println("Fragment Selected " + tab.getText().toString()); 
      } 

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

//    System.out.println("Fragment Deselected " + tab.getText().toString()); 

      } 

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

//    System.out.println("Fragment Reselected " + tab.getText().toString()); 

      } 
     }); 
    } 

    public void setUpToolbar() { 

     toolbar = (Toolbar) findViewById(R.id.toolbar_pattern_selector); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setDisplayShowTitleEnabled(false); 
     toolbar.setNavigationOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       onBackPressed(); 
      } 
     }); 
     SpinnerAdapter spinnerAdapter = ArrayAdapter.createFromResource(this, R.array.spinner_pattern_selector, R.layout.item_spinner_pattern_selector); 
     spinner = new Spinner(getSupportActionBar().getThemedContext()); 
     spinner.setAdapter(spinnerAdapter); 
     toolbar.addView(spinner, 0); 
     spinner.setSelection(patternSelectedMode); 

     spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 

      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 

       switch (position) { 
        case 1: 
         patternSelectedMode = 1; 
         Toast.makeText(getApplicationContext(), getResources().getString(R.string.pattern_image_selected_single), Toast.LENGTH_SHORT).show(); 
         for (PatternImages current : patternImages) { 
          current.setSelected(false); 
         } 
         patternsPagerAdapter.notifyDataSetChanged(); 
         break; 
        case 2: 
         patternSelectedMode = 2; 
         Toast.makeText(getApplicationContext(), getResources().getString(R.string.pattern_image_selected_multiple), Toast.LENGTH_SHORT).show(); 
         patternsPagerAdapter.notifyDataSetChanged(); 
         break; 
        default: 
         patternSelectedMode = 0; 
       } 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> parent) { 

      } 
     }); 
    } 

    public ArrayList<PatternImages> getPatternImages() { 

     return patternImages; 
    } 
    public int getSpinnerValue() { 

     return patternSelectedMode; 
    } 

    public void setPattern(MenuItem item) { 

     Intent returnIntent = new Intent(); 
     returnIntent.putParcelableArrayListExtra(PATTERN_IMAGES, patternImages); 
     returnIntent.putExtra(PATTERN_SELECTED_MODE, patternSelectedMode); 
     setResult(RESULT_OK, returnIntent); 
     finish(); 
     overridePendingTransition(R.anim.in_left, R.anim.out_right); 

    } 
    @Override 
    public void onWindowFocusChanged(boolean hasFocus) { 
//  spinner.startAnimation(AnimationUtils.loadAnimation(this, R.anim.get_attention)); 
//  Log.d(TAG, "onWindowFocusChanged Started"); 
     super.onWindowFocusChanged(hasFocus); 
    } 
    @Override 
    public void onBackPressed() { 

     if (tabLayout.getSelectedTabPosition() > 0) { 
      viewPager.setCurrentItem(tabLayout.getSelectedTabPosition() - 1); 
     } else { 
      Intent returnIntent = new Intent(); 
      returnIntent.putParcelableArrayListExtra(PATTERN_IMAGES, patternImages); 
      returnIntent.putExtra(PATTERN_SELECTED_MODE, patternSelectedMode); 
      setResult(RESULT_CANCELED, returnIntent); 
      finish(); 
      overridePendingTransition(R.anim.in_left, R.anim.out_right); 
      super.onBackPressed(); 
     } 
    } 

片段

public static FragmentCommonPatterns newInstance(int minIndex, int maxIndex, String fragmentTitle, int patternSelectedMode) { 

    FragmentCommonPatterns patterns = new FragmentCommonPatterns(); 
    Bundle args = new Bundle(); 
    args.putInt(MIN_NUMBERS, minIndex); 
    args.putInt(MAX_NUMBERS, maxIndex); 
    args.putInt(PATTERN_SELECTED_MODE, patternSelectedMode); 
    args.putString(TITLE, fragmentTitle); 
    patterns.setArguments(args); 
    return patterns; 
} 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    Log.d(TAG, "onCreate: "); 
    minIndex = getArguments().getInt(MIN_NUMBERS); 
    maxIndex = getArguments().getInt(MAX_NUMBERS); 
    fragmentTitle = getArguments().getString(TITLE); 
    titles = getResources().getStringArray(R.array.tabs_pattern_title); 

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.fragment_common_patterns, container, false); 
    if (fragmentTitle.equals(titles[4])) { 
     floatingActionButton = (FloatingActionButton) view.findViewById(R.id.fab_custom_patterns); 
     floatingActionButton.setVisibility(View.VISIBLE); 
     floatingActionButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       Toast.makeText(getActivity(), "Edit your own custom patterns", Toast.LENGTH_SHORT).show(); 
       //TODO 
      } 
     }); 
    } 
    ActivityPatternSelector activityPatternSelector = (ActivityPatternSelector) getActivity(); 
    patternImages = activityPatternSelector.getPatternImages(); 
    patternSelectedMode=activityPatternSelector.getSpinnerValue(); 
    setUpPatternsRecyclerView(view); 
    return view; 
} 

private void setUpPatternsRecyclerView(View view) { 

    RecyclerView recyclerPatternsView = (RecyclerView) view.findViewById(R.id.pattern_image_recycler_view); 
    PatternImageAdapter adapter = new PatternImageAdapter(getActivity(), patternImages.subList(minIndex, maxIndex), patternSelectedMode); 
    recyclerPatternsView.setAdapter(adapter); 
    ColumnQty columnQty = new ColumnQty(getActivity(), R.layout.item_image_pattern_cardview); 
    GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), columnQty.calculateNoOfColumns()); 
    recyclerPatternsView.setHasFixedSize(true); 
    recyclerPatternsView.setLayoutManager(gridLayoutManager); 
    recyclerPatternsView.setItemAnimator(new DefaultItemAnimator()); 
    recyclerPatternsView.addItemDecoration(new GridSpacing(columnQty.calculateSpacing())); 
} 
+0

发布您的活动的完整代码。 – earthw0rmjim

+0

@ earthw0rmjim,done – Racu

回答

1

您可以添加一个 “updatePattern” 的方法来你的片段。

然后迭代适配器中的片段并更新它们。

伪代码:

for (int i = 0 ; i < fragmentsArray.size() ; i ++) { 
      Fragment fragment = fragmentPagerAdapter.getItem(i); 
      fragment.updateSelectedPatternMode(newPattern); 
} 

PS:对于cleanred代码可以封装在你PagerAdapter内片段迭代,并添加一个公共更新方法的适配器。

+1

我喜欢你的想法@mrsegev,但是想到了重置'FragmentPagerAdapter',而这正是我所做的,基本上可以工作,做我想做的事,但是并没有解决我的问题。只是想知道在效率方面是否要走。我在我的微调器的三种情况下调用了'setUpPagerAdapter()',它重置了我的PagerAdapter,并且我可以使用ViewPager将它重置到之前的位置。 谢谢+1的想法。 – Racu

+0

有趣的解决方案!实际上,就效率而言,我相信直接更新片段会更有效率,因为每次选择更改时,只会调用片段中的相关代码,而不会强制整个寻呼机重新创建它自己。 (类似于RecyclerView的有效载荷?) – mrsegev

+0

最后,我发现我所做的完全错了,我在'ViewPager'上堆叠'ViewPager',对我来说这没问题,但并不是最优的(我的意思是微调的目的不是永远选择价值: - D)。最终应用您的答案并在这里和那里实现接口。谢谢您的意见。 – Racu

相关问题