【发布时间】:2020-09-22 11:27:46
【问题描述】:
我通过在循环中使用 ViewGroup 动态创建多个 Spinner,我成功地做到了,但是当我从微调器中选择一个项目时,setOnItemSelectedListener() 不会在项目选择上调用。而是在微调器创建和值填充之后的第一次调用。
我认为 Spinner 的实例在创建后正在销毁,或者我使用了错误的监听器。
这里可以看到我的相关代码:
List<SpinnerItem> arrSpinnerItem;
List<AppCompatSpinner> arrSpinners = new ArrayList<>();
// here is the function
//outer loop to create spinners
for (int i = 0; i < 2; i++) {
LinearLayout newView = (LinearLayout) getLayoutInflater().inflate(R.layout.view_linear_layout, null);
newView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
AppCompatSpinner spinner = newView.findViewById(R.id.view_spinner);
// AppCompatSpinner spinner = new AppCompatSpinner(context);
spinner.setTag(i);
arrSpinners.add(spinner); //adding instance for the listener
//inner loop to add items to the created spinner
arrSpinnerItem = new ArrayList<>();
for (int j = 0; j < 2; j++) {
arrSpinnerItem.add(new SpinnerItem("id", "name"));
}
//spinner adapter
if (arrSpinnerItem.size() > 0)
spinner.setAdapter(new SpinnerItemAdapter(context, R.layout.item_spinner, arrSpinnerItem));
layout_viewContainer.addView(newView);
}
//listener for all creating spinners
for (AppCompatSpinner compatSpinner : arrSpinners)
compatSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) { //=> ERROR: doesn't invoke on item click
Log.e(TAG, "callback: " + arrSpinners.get(position).getSelectedItem());
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});0
activity_main.xml
<LinearLayout
android:id="@+id/addSale2Act_layout_viewContainer"
android:padding="@dimen/_10sdp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</LinearLayout>
SpinnerItem.java
public class SpinnerItem {
private String id, name;
public SpinnerItem(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
@Override
public String toString() {
return name;
}
}
view_linear_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_marginTop="@dimen/_20sdp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@drawable/shape_rec_spinner"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="@dimen/_18sdp"
android:layout_height="@dimen/_18sdp"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginEnd="@dimen/_10sdp"
android:paddingTop="@dimen/_4sdp"
app:srcCompat="@drawable/ic_arrow_down" />
<androidx.appcompat.widget.AppCompatSpinner
android:id="@+id/view_spinner"
style="@style/RippleEffect"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_gravity="center"
android:background="@android:color/transparent"
android:gravity="center"
android:spinnerMode="dropdown" />
</RelativeLayout>
</LinearLayout>
【问题讨论】:
-
您正在 getView 方法中编写这个动态微调器循环?
-
不,我在简单的活动中使用它
-
拜托 --> 在动态微调器循环中移动监听器代码并再次检查
-
我也试过了。即使我检查了数组是否保留了添加的微调器实例,但在项目单击时,函数不会调用
标签: android listener dropdown android-spinner