Android自定义ArrayAdapter呈现列表中的对象,而不是值

时间:2018-08-19 01:43:01

标签: android android-layout spinner android-arrayadapter android-spinner

我正在尝试将自定义布局(包含两个TextView的LinearLayout)绑定到Spinner。我正确地将ArrayAdapter子类化了。在Spinner中选择一个项目会正确调用getView(),并正确设置LinearLayout的TextViews的值。问题是微调器中项目的初始显示(单击微调器时)仅显示对象。不是应该显示的TextView。仅在单击对象之一后,微调器才使用我的自定义适配器的getView()方法正确设置TextViews。这是自定义适配器类:

public class BusRouteAdapter extends ArrayAdapter<BusRoute> {
...
public BusRouteAdapter(Context context, int resource, int textViewId, ArrayList<BusRoute> routes) {
    super(context, resource, textViewId, routes);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    BusRoute route = getItem(position);
    if (convertView == null) {
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.bus_route, parent, false);
    }
    TextView tvBusRoute = (TextView) convertView.findViewById(R.id.tvBusRoute);
    TextView tvBusRouteNumber = (TextView) convertView.findViewById(R.id.tvBusRouteNumber);
    tvBusRoute.setText(route.routeName); 
    tvBusRoute.setTag(route.route);
    tvBusRouteNumber.setText(route.route);
    if (!route.routeColor.equals("")) {
        tvBusRouteNumber.setBackgroundColor(Color.parseColor(route.routeColor));
    }
    return convertView;
}
}

以下是每个Spinner列表项(bus_route.xml)使用的布局:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:weightSum="1">

    <TextView
        android:id="@+id/tvBusRouteNumber"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.25"
        android:padding="8dp" />

    <TextView
        android:id="@+id/tvBusRoute"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.75"
        android:padding="8dp" />
</LinearLayout>

在“活动”中,我将适配器设置为正确填充的BusRoute对象列表:

busRouteAdapter = new BusRouteAdapter(getBaseContext(), R.layout.bus_route, R.id.tvBusRoute, arrayOfBusRoutes);
        routesSpinner.setAdapter(busRouteAdapter);

我需要传递布局ID(R.layout.bus_route)和该布局中包含的TextView之一(R.id.tvBusRoute),这似乎很奇怪。

这是单击微调器时呈现的内容:

popup list when Spinner is clicked

但是,如果我单击对象之一,则会调用getView(),并且正确呈现了所选的Layout和TextViews(显然,我选择了“ GMU-Pentagon”):

selected item

我缺少什么让Spinner的弹出列表显示正确呈现的所有公交路线项目?

1 个答案:

答案 0 :(得分:0)

我认为您需要重写getDropDownView来处理微调框

  @Override
        public View getDropDownView(int position, View convertView, ViewGroup parent) {
             BusRoute route = getItem(position);
    if (convertView == null) {
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.bus_route, parent, false);
    }
    TextView tvBusRoute = (TextView) convertView.findViewById(R.id.tvBusRoute);
    TextView tvBusRouteNumber = (TextView) convertView.findViewById(R.id.tvBusRouteNumber);
    tvBusRoute.setText(route.routeName); 
    tvBusRoute.setTag(route.route);
    tvBusRouteNumber.setText(route.route);
    if (!route.routeColor.equals("")) {
        tvBusRouteNumber.setBackgroundColor(Color.parseColor(route.routeColor));
    }
    return convertView;

        }