Событие Spinner OnItemSelected не вызывается - PullRequest
0 голосов
/ 08 мая 2019

Я использую значение в счетчике, чтобы помочь отфильтровать список, который будет источником данных для RecyclerView.Кажется, что метод OnItemSelect никогда не вызывается, когда я использую счетчик

Это приложение для Android, построенное на Java, использующее Pie для ОС.Проект был создан с использованием Базового шаблона активности.

Класс активности

package com.logicscrew.android;

import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;

import com.logicscrew.android.helpers.APIHelper;
import com.logicscrew.android.helpers.EmployeeAdapter;
import com.logicscrew.android.models.Department;
import com.logicscrew.android.models.Employee;

import java.util.ArrayList;
import java.util.List;

public class ViewByDepartment extends AppCompatActivity implements AdapterView.OnItemSelectedListener {

    private List<Employee> employees;
    private List<Employee> filteredList;
    private List<Department> deparments;
    private RecyclerView rcView;
    private EmployeeAdapter adapter;
    private Context context;
    private Spinner spinner;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        employees = new ArrayList<>();
        deparments = new ArrayList<>();
        filteredList = new ArrayList<>();
        setContentView(R.layout.activity_view_by_department);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        spinner =(Spinner)findViewById(R.id.spnDepartments);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        context = this;

        FetchTask task = new FetchTask(new AsyncResponse() {
            @Override
            public void processFinished(List<Employee> output) {
                Log.i("Employees", "Finished");
            }


        });

        DeptTask deptTask = new DeptTask(new DeptResponse() {
            @Override
            public void processFinished(List<Department> output) {
                Log.i("Department", "Finished");
            }
        });


        task.execute();
        deptTask.execute();


        rcView = findViewById(R.id.rcEmp);
        adapter = new EmployeeAdapter(context, filteredList);
        rcView.setLayoutManager(new LinearLayoutManager(context));
        rcView.setAdapter(adapter);




        ArrayAdapter<Department> deptAdapter = new ArrayAdapter<>(
                this,
                R.layout.spinner,
                deparments
        );


        deptAdapter.setDropDownViewResource(
                R.layout.spinner
        );

        spinner.setAdapter(deptAdapter);


        spinner.setOnItemSelectedListener(this);
    }

    private void filter(){
        filteredList.clear();
        filteredList.addAll(employees);
        for(Employee e : filteredList){
            if(e.department != spinner.getSelectedItem()){
                filteredList.remove(e);
            }
        }

        adapter.swapDataSet(filteredList);
    }

    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
        filter();
    }

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

    }


    private class FetchTask extends AsyncTask<Void, Void, List<Employee>> {
        public AsyncResponse delegate = null;

        public FetchTask(AsyncResponse asyncResponse){
            delegate = asyncResponse;
        }


        @Override
        protected List<Employee> doInBackground(Void... voids) {

            return new APIHelper().fetchItems();
        }

        @Override
        protected void onPostExecute(List<Employee> items) {
            employees.addAll(items);
            filteredList.addAll(items);
            adapter.notifyDataSetChanged();
            delegate.processFinished(items);
        }
    }

    private class DeptTask extends AsyncTask<Void, Void, List<Department>>{

        public DeptResponse delegate;

        public DeptTask(DeptResponse response){
            delegate = response;
        }

        @Override
        protected List<Department> doInBackground(Void... voids) {
            return new APIHelper().fetchDepartments();
        }

        @Override
        protected void onPostExecute(List<Department> items){
            deparments.addAll(items);
            delegate.processFinished(items);
        }
    }

    public interface AsyncResponse{
        void processFinished(List<Employee> output);

    }

    public interface DeptResponse{
        void processFinished(List<Department> output);
    }

}

Что должно произойти, так это то, что когда вызывается событие, оно фильтрует список, удаляя всех в списке, ктоне в конкретном отделе, но событие никогда не вызывается.

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Проблема была в асинхронном состоянии гонки. Исправлено перемещением настройки Spinner в метод processFinished в DeptTask.

DeptTask deptTask = new DeptTask(new DeptResponse() {
            @Override
            public void processFinished(List<Department> output) {
                Log.i("Department", "Finished");

                ArrayAdapter<Department> deptAdapter = new ArrayAdapter<Department>(
                        getApplicationContext(),
                        R.layout.spinner,
                        deparments
                );


                deptAdapter.setDropDownViewResource(
                        R.layout.spinner
                );


                spinner.setAdapter(deptAdapter);

                spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                    @Override
                    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                        Log.i("Selected Item", "I AM INDEED WORKING");
                        filter((Department)spinner.getSelectedItem());

                    }



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

                    }
                });
            }


        });
0 голосов
/ 08 мая 2019

Вы пытаетесь положить вСоздать:

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int myPosition, long myID) {

            //your method
        }

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

        }

    });
...