Isaac Obella
Isaac Obella

Reputation: 2643

Spinner listener to change activity

I have a tabbed activity that has a spinner in its Toolbar. I need to trigger changes in the tab fragments whenever the spinner value changes.

I have so far implemented it by getting the cropsSpinner instance from the Fragment. However it's not working as needed. I am new to listeners; is there a way I can do this with Android callbacks?

ExtensionActivity.java

public class ExtensionActivity extends AppCompatActivity {

    private SectionsPageAdapter mSectionsPageAdapter;
    @BindView(R.id.container) ViewPager mViewPager;
    @BindView(R.id.tabs) TabLayout tabLayout;
    @BindView(R.id.toolbar) Toolbar toolbar;
    @BindView(R.id.spinner_nav) public Spinner cropsSpinner;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_extension);
        ButterKnife.bind(this);

        mSectionsPageAdapter = new SectionsPageAdapter(getFragmentManager());
        setupViewPager(mViewPager);

        tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
        tabLayout.setupWithViewPager(mViewPager);
    }

    private void setupViewPager(ViewPager viewPager){
        SectionsPageAdapter adapter  = new SectionsPageAdapter(getFragmentManager());

        adapter.addFragment(new ExtDescFragment(),"Description");
        adapter.addFragment(new ExtLandPFragment(),"Land Preparation");

        viewPager.setAdapter(adapter);
    }

ExtDescFragment.java

public class ExtDescFragment extends Fragment {

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

        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_ext_desc, container, false);
        ButterKnife.bind(this,view);
        ((ExtensionActivity)getActivity()).cropsSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                CROP =((ExtensionActivity)getActivity()).cp.get(position);
                Log.e("CROP",CROP);
                getCropInf();
            }

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

            }
        });
    }

Upvotes: 1

Views: 599

Answers (1)

nhoxbypass
nhoxbypass

Reputation: 10152

For your additional info I suggest you let your cropperSpinner private and using list custom listener like:

interface OnCropperSpinnerSelectedListener {
    void onItemSelected(int pos);
}

Then store a list of listener in ExtensionActivity:

List<OnCropperSpinnerSelectedListener> listeners;

after that write a setter method to add listener to the listener list:

void addCropperSpinnerSelectedListener(OnCropperSpinnerSelectedListener listener) {
    listeners.add(listener);
}

Then, you have to implement OnItemSelectedListener in ExtensionActivity:

cropsSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                    for(int i = 0; i < listeners.size(); i++) {
                       listeners.get(i).onItemSelected(position);
                    }
                }

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

                }
});

Finally, when you want any Fragment to listen to spinner value changes event (Eg: ExtDescFragment), just call the method addCropperSpinnerSelectedListener() inside onCreate() of this fragment and implement your own logic.

Explain: So every time user select item on spinner, the AdapterView.OnItemSelectedListener will call onItemSelected(), here we loop through our custom listener list that have connection to fragments and call our onItemSelected(int pos) to notify all fragment.

Upvotes: 1

Related Questions