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

相關問題