Android 自定义 ArrayAdapter 呈现列表中的对象,而不是值
Android custom ArrayAdapter rendering Objects in list, not values
我正在尝试将自定义布局(包含两个 TextView 的 LinearLayout)绑定到 Spinner。我 subclassed ArrayAdapter(大部分)正确。选择 Spinner 中的项目会正确调用 getView(),从而正确设置 LinearLayout 的 TextViews 值。问题是微调器中项目的初始显示(单击微调器时)仅显示对象;而不是他们应该显示的 TextView。只有在单击其中一个对象后,Spinner 才会使用我的自定义适配器的 getView() 方法正确设置 TextView。这是自定义适配器 class:
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>
在我的 Activity 中,我将适配器设置为正确填充的 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),这似乎很奇怪。
这是单击微调器时呈现的内容:
但是如果我单击其中一个对象,则会调用 getView(),并且会正确呈现所选的 Layout 和 TextView(显然我选择了 "GMU - Pentagon"):
我缺少什么才能让 Spinner 的弹出列表显示正确呈现的所有公交路线项目?
我认为您需要覆盖 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;
}
我正在尝试将自定义布局(包含两个 TextView 的 LinearLayout)绑定到 Spinner。我 subclassed ArrayAdapter(大部分)正确。选择 Spinner 中的项目会正确调用 getView(),从而正确设置 LinearLayout 的 TextViews 值。问题是微调器中项目的初始显示(单击微调器时)仅显示对象;而不是他们应该显示的 TextView。只有在单击其中一个对象后,Spinner 才会使用我的自定义适配器的 getView() 方法正确设置 TextView。这是自定义适配器 class:
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>
在我的 Activity 中,我将适配器设置为正确填充的 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),这似乎很奇怪。
这是单击微调器时呈现的内容:
但是如果我单击其中一个对象,则会调用 getView(),并且会正确呈现所选的 Layout 和 TextView(显然我选择了 "GMU - Pentagon"):
我缺少什么才能让 Spinner 的弹出列表显示正确呈现的所有公交路线项目?
我认为您需要覆盖 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;
}