android - 带有下拉列表图标的材质微调器
问题描述
我正在尝试使用 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。