【发布时间】:2016-01-18 15:40:04
【问题描述】:
我正在尝试在适配器中声明和初始化最终变量,以便在 OnLongClickListener() 声明中使用该变量。问题是该变量正在由可能引发失败异常的方法初始化,因此初始化必须在 try/catch 的上下文中进行。在异常块中,有一个最终变量被分配给的后备值。这一切都发生在ArrayAdapter<T> 的覆盖getView() 内。
我的问题是,有没有一种巧妙的方法可以做到这一点?我通过在 try/catch 之外声明一个临时变量,并在 try/catch 中对其进行初始化,然后在 try/catch 块之后使用临时变量的结果声明和初始化最终变量来解决这个问题。这感觉太乱了。
代码:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) Data.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//begin eww gross
Vehicle temp;
try {
temp = Data.getVehicle(values.get(position).getId());
} catch (ObjectNotFoundException e) {
Log.e(TAG, e.getMessage() + "-- unable to find vehicle while getting list item vehicle for vehicles tab fragment");
temp = values.get(position);
}
final Vehicle vehicle = temp;
//end disappointing, ugly workaround
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.vehicle_item_with_img, null);
holder = new ViewHolder();
holder.vehicleLabel = (TextView) convertView.findViewById(R.id.vehicle_label);
holder.statusImage = (ImageView) convertView.findViewById(R.id.lmImageView);
holder.sImage = (ImageView) convertView.findViewById(R.id.sImageView);
holder.vehicleTag = vehicle.getId();
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (Data.isFollowingVehicle(vehicle)) {
holder.sImage.setVisibility(View.VISIBLE);
}
else {
holder.sImage.setVisibility(View.INVISIBLE);
}
holder.statusImage.setImageDrawable(vehicle.getListIcon());
holder.vehicleLabel.setText(vehicle.getFormattedLabel());
final ViewHolder finalHolder = holder;
convertView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (!vehicle.isFollowed()) {
finalHolder.sImage.setVisibility(View.VISIBLE);
mapInterface.follow(vehicle);
} else {
finalHolder.sImage.setVisibility(View.GONE);
mapInterface.unfollow(vehicle);
}
return false;
}
});
convertView.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
mapInterface.handleVehicleClickFromList(vehicle);
}
});
return convertView;
}
【问题讨论】:
-
你可以用字段代替,是吗?
-
@gio 我想我对字段的反射属性不够熟悉,不知道如何使用它们来解决这个问题。