java - Spinner OnItemSelected 事件未被调用
问题描述
我正在使用微调器中的值来帮助过滤将成为 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);
}
}
应该发生的是,当事件被调用时,它过滤列表,删除列表中不属于特定部门的任何人,但从不调用该事件。
解决方案
问题是异步竞争条件。通过将 Spinner 设置移动到 DeptTask 中的 processFinished 方法来修复。
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) {
}
});
}
});
推荐阅读
- php - Php,依赖注入,如何替换对象(用于测试)?
- asp.net-core - 无法使用 HttpContext 访问用户
- python - python - 在python上的Tkinter上使用Entry时如何禁用键盘输入?
- angular - 在 Angular 中处理两种类型的用户身份验证
- javascript - FaunaDB FQL - 找不到表单/函数,或无效的参数键:{ params }
- r - 使用循环子集日期集 - 将文件拆分为更小的多个数据集
- reactjs - 材质ui中是否有带有“showmore”的折叠组件
- javascript - Javascript - 从 innerHTML 元素获取 Id
- javascript - 将当前 CSS 设置存储在本地存储中
- java - gradle java项目中fat jar的替代品