首页 > 解决方案 > 带有下拉列表图标的材质微调器

问题描述

我正在尝试使用 suqqested methdod 实现带有下拉列表的 android Material Spinner:TextInputLayout 和 AutoCompleteTextView + arrayadapter: 在此处输入图像描述

问题是:如何设置下拉列表行图标(每行都有自己的可绘制、文本和存储在 SQLite 中的图标)。下拉列表布局是简单的文本视图,我正在尝试设置 drawableleft 图标。如果我这样做,列表没问题,但 OnClickEvent 停止工作,我必须知道选择了哪个项目。如果适配器是普通的arrayadapater,onclick是可以的,但是左边的图标不能设置。我设置适配器的代码:

        dlistcursor = SQLite.GetRCDevices(mainActivity.database);
    devarray.clear(); // fill devarray with cursor data
    for (dlistcursor.moveToFirst();!dlistcursor.isAfterLast();dlistcursor.moveToNext()) {
        devarray.add(dlistcursor.getString(2));
    }
    ArrayAdapter adapter = new ArrayAdapter(root.getContext(), R.layout.spinner_row, devarray);
    TestAdapter testAdapter = new TestAdapter(root.getContext(), R.layout.spinner_row, devarray);

    DeviceCursorAdapter deviceCursorAdapter = new DeviceCursorAdapter(getContext(),dlistcursor);
    rcdeviceBinding.devlist.setAdapter(deviceCursorAdapter);

我尝试了两个适配器:扩展 CursorAdapter 的适配器和另一个扩展 ArrayAdapter。光标适配器的代码:

    public class DeviceCursorAdapter extends CursorAdapter {
    private Context context;
    private Cursor cursor;
    public DeviceCursorAdapter(Context context, Cursor c) {
        super(context,c);
        this.context = context;
        cursor = c;
    }
    @Override
    public int getCount() {
        return cursor.getCount();
    }

    @Override
    public Object getItem(int position) {
        cursor.moveToPosition(position);
        return cursor;
    }
    @Override
    public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(R.layout.rcdevice_row,viewGroup,false);
        return v;
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        TextView textView = view.findViewById(R.id.dname);
        textView.setText(cursor.getString(2));
        textView.setCompoundDrawablesWithIntrinsicBounds(Name_Icon_Lists.rcdevice_images[cursor.getInt(1)],0,0,0);
    }
}

以及 ArrayAdapter 的代码:

    public class TestAdapter extends ArrayAdapter {
    private Context context;

    public TestAdapter(@NonNull Context context, int resource,ArrayList<String> arrayList ) {
        super(context, resource, arrayList);
        this.context = context;
    }
    @NonNull
    @Override  //commenting this getView enables OnClickItem
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(R.layout.rcdevice_row,parent,false);
        TextView textView = v.findViewById(R.id.dname);
        dlistcursor.moveToPosition(position);
        textView.setText(dlistcursor.getString(2));
        // set the left drawablbe icon
        textView.setCompoundDrawablesWithIntrinsicBounds(Name_Icon_Lists.rcdevice_images[dlistcursor.getInt(1)],0,0,0);
        return v;
    }
}

和 OnClickEvent:

        rcdeviceBinding.devlist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            currentRCDevice = devarray.get(i);
            SharedPreferences.Editor editor = mainActivity.prefs.edit();
            editor.putString("currentRCDevice", currentRCDevice);
            editor.commit();
            actionBar.setTitle(String.format("RCDevice %s", currentRCDevice));
            controlcursor = SQLite.GetRCDeviceControls(currentRCDevice, mainActivity.database);
            controllistadapter.changeCursor(controlcursor);
        }
    });

这两个适配器都禁用了 OnClick,但如果 getView 没有被覆盖 onclick 工作,但不是列表图标。使用旧的 Spinner 会很容易,但我想使用 Material Spinner。

标签: androidmaterial-designspinner

解决方案


推荐阅读