Spinner не работает в обычном диалоге - почему? - PullRequest
0 голосов
/ 13 декабря 2018

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

И поскольку я нигде не нашел ничего полезного, нужно ли мне что-то знать при использовании счетчика в диалоге?

CustomDialog Класс:

public SelectionDialog(Activity context, ArrayAdapter<T> arrayAdapter, List<T> objects) {
    super(context);
    this.activity = context;
    this.arrayAdapter = arrayAdapter;
    this.objects = objects;
}



@SuppressLint("ResourceAsColor")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));

    View view = LayoutInflater.from(getContext()).inflate(R.layout.dialog_selection,null);

    setContentView(view);

    BodyMenuCard parentCard = view.findViewById(R.id.parentCard);
    parentCard.setHeader(header);

    TextView textView = parentCard.getCardBody().findViewById(R.id.bodyText);
    textView.setText(description);

    yesBtn = parentCard.getCardBody().findViewById(R.id.btn_yes);

    //spinner = parentCard.getCardBody().findViewById(R.id.employeeSpinner);
    spinner = view.findViewById(R.id.employeeSpinner);
    spinnerHandler = new EmployeeSpinnerHandler(getContext(), spinner, (List<Employee>) 
    toggleYesBtn(false);


    if (iconRessoruce != -1) parentCard.setIcon(iconRessoruce);
    if (backgroundColor != -1) parentCard.setCircleColor(backgroundColor);

    if (successfullCallback != null) yesBtn.setOnClickListener((v -> successfullCallback.onClick(this)));
    if (abbortCalllback != null) {
        parentCard.getCardBody().findViewById(R.id.btn_no).setOnClickListener((v -> abbortCalllback.onClick(this)));
    } else {
        parentCard.getCardBody().findViewById(R.id.btn_no).setOnClickListener(v -> this.dismiss());
    }
}

EmployeeSpinnerAdapter

public class EmployeeSpinnerAdapter extends ArrayAdapter<Employee> {

private Map<String, ColorStateList> employeeColors;

private List<Employee> employees;

private RandomMaterialColor randomColor;

public EmployeeSpinnerAdapter(Context context, List<Employee> employees) {
    super(context, R.layout.employee_spinner, employees);
    setDropDownViewResource(R.layout.employee_spinner);
    this.employees = employees;
    this.employeeColors = new HashMap<>();
}

private class ViewHolder {

    private GradientDrawable background;
    private TextView header;
    private TablePart idField;

    private ViewHolder(View view) {
        if (randomColor == null) randomColor = new RandomMaterialColor(view.getResources(), view.getContext());
        ImageView iv = view.findViewById(R.id.icon_view);
        background = (GradientDrawable) iv.getBackground().mutate();
        header = view.findViewById(R.id.header);
        idField = view.findViewById(R.id.description);
    }

    private void populate(Employee employee) {
        header.setText(employee.getName());
        idField.update(employee.getId());
        ColorStateList color = employeeColors.getOrDefault(employee.getId(), ColorStateList.valueOf(randomColor.getMatColor("A700")));
        background.setColor(color);
    }

}

@Override
public int getCount() {
    return employees.size();
}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    return obtainView(position, convertView, parent);
}

@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) 
{
    return obtainView(position, convertView, parent);
}

private View obtainView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        LayoutInflater mInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        convertView = mInflater.inflate(R.layout.employee_spinner, parent, false);
        convertView.setTag(new ViewHolder(convertView));
    }
    ViewHolder vh = (ViewHolder) convertView.getTag();
    vh.populate(employees.get(position));
    return convertView;
}
}

EmployeeSpinnerHandler Цель этого класса - точнотот же код обрабатывает Spinner внутри диалога и снаружи, чтобы найти ошибку.

public class EmployeeSpinnerHandler {

private Context context;

private Spinner spinner;

private EmployeeSpinnerAdapter adapter;

private List<Employee> employees;

public EmployeeSpinnerHandler(Context context, Spinner spinner, List<Employee> employees) {
    this.context = context;
    this.spinner = spinner;
    this.employees = employees;

    setUp();
}

private void setUp() {

    adapter = new EmployeeSpinnerAdapter(getContext(), employees);
    spinner.setAdapter(adapter);

    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            FancyToast.makeText(getContext(), "selected: " + employees.get(position).getName(), Toast.LENGTH_LONG, FancyToast.SUCCESS, true).show();
            //toggleYesBtn(true);
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
            //toggleYesBtn(false);
            FancyToast.makeText(getContext(), "selected: none", Toast.LENGTH_LONG, FancyToast.SUCCESS, true).show();
        }
    });

}

public void updateObjects(List<Employee> employees) {
    this.employees.clear();
    this.employees.addAll(employees);
    adapter.notifyDataSetChanged();
}
}

Spinner внутри обычного фрагмента

spinner = view.findViewById(R.id.employeeSpinner);
    EmployeeSpinnerHandler spinnerHandler = new EmployeeSpinnerHandler(getContext(), spinner, objects);

Примечание: В случаях с кабиной дата извлекается из REST-Api, но она все еще работает только в обычном фрагменте.

И теперь проблема в том, что если я использую EmployeeSpinnerHandler на Spinner, расположенном внормальный фрагмент, он работает, но если я использую Spinner в диалоге выбора, вы можете щелкнуть по spinner, и элементы появятся, но их нельзя будет выбрать (см. изображения).

Изображения:

CПользовательский диалог со Spinner

Всплывающее окно из Spinner в настраиваемом диалоге, в котором можно увидеть данные, присутствующие, но при щелчке они закрывают только всплывающее окно

Обтекатель, работающий внутри нормального фрагмента

1 Ответ

0 голосов
/ 14 декабря 2018

Кажется, что отсутствует визуальное обновление, если приведенный ниже код возвращает элемент: FancyToast.makeText (getContext (), "selected:" + employee.get (position) .getName (), Toast.LENGTH_LONG, FancyToast.УСПЕХ, true) .show ();

В этом случае я бы рекомендовал добавить spinner.setSelection (position)

...