我有一个从基础适配器扩展的自定义适配器,并且我在每一行内都有一个微调器(与每个产品的数量有关的东西 - >来自列表视图的项目)。当用户选择微调器的不同值时,我必须刷新显示总价的 TextView(该行中的 TextView -- productQuantity * productPrice )。问题是,在 spinner.setOnItemClickListener 中调用 notifyDataSetChanged 完全弄乱了我的列表视图,大大降低了帧数。是否有任何(其他可能)解决方案来解决这个问题..(我正在寻找在适配器 getView 中刷新一行,但找不到合适的解决方案)。
适配器
public class CartAdapter extends BaseAdapter {
private List<ProductDetailedHolder> itemsList = new ArrayList<ProductDetailedHolder>();
private ProductDetailedHolder item = null;
private Activity activity;
private final String[] quantityValues = new String[] { "1", "2", "3", "4",
"5", "6", "7", "8", "9", "10" };
private DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnFail(R.drawable.bulina)
.displayer(new RoundedBitmapDisplayer(15))
.bitmapConfig(Bitmap.Config.RGB_565)
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2).build();
private ViewHolder holder = null;
private ImageLoader imageLoader;
public CartAdapter(List<ProductDetailedHolder> array, Activity activity,
ImageLoader imageLoader) {
this.activity = activity;
this.itemsList = array;
this.imageLoader = imageLoader;
}
@Override
public int getCount() {
return itemsList.size();
}
@Override
public Object getItem(int position) {
return itemsList.get(position);
}
@Override
public long getItemId(int position) {
return itemsList.get(position).getProductId();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
item = itemsList.get(position);
if (convertView == null) {
convertView = activity.getLayoutInflater().inflate(
R.layout.row_cart_item, null);
holder = new ViewHolder(convertView);
ArrayAdapter<String> quantityAdapter = new ArrayAdapter<String>(
activity, android.R.layout.simple_spinner_item,
quantityValues);
quantityAdapter
.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
holder.spin_row_cart_quantity.setAdapter(quantityAdapter);
holder.spin_row_cart_quantity
.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0,
View arg1, int arg2, long arg3) {
int getPosition = (Integer) arg0.getTag();
Log.d(ServiceManager.TagOSDShop, "getPosition: "
+ getPosition);
itemsList.get(getPosition).setProductQuantity(
Integer.valueOf(
arg0.getSelectedItem().toString())
.intValue());
// here I need to refresh the row with holder.tv_row_cart_price.setText ( productQuantity * productPrice), but I can't use notifyDataSetChanged on all adapter, because this would refresh the entire list (and spinner.setOnItemSelected fires when the list is initialised, causing my listview to run very slow and ugly.
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// do nothing
}
});
holder.ib_row_cart_delete
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int getPosition = (Integer) v.getTag();
itemsList.remove(getPosition);
}
});
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tv_row_cart_title.setText(item.getProductName());
holder.tv_row_cart_color.setText(Html
.fromHtml("<font color=\"#999999\"> Color </font> <br />"
+ item.getProductColor()));
holder.tv_row_cart_size.setText(Html
.fromHtml("<font color=\"#999999\"> Size </font> <br />"
+ item.getProductSize()));
holder.tv_row_cart_details.setText(item.getProductDescription());
holder.tv_row_cart_price.setText(String.valueOf(item.getProductPrice()
* item.getProductQuantity()));
holder.ib_row_cart_delete.setTag(position);
holder.spin_row_cart_quantity.setSelection(findSelection(item));
holder.spin_row_cart_quantity.setTag(position);
imageLoader.displayImage(item.getProductImageUrl(),
holder.iv_row_cart_content, options);
return convertView;
}
private int findSelection(ProductDetailedHolder item) {
for (int i = 0; i < quantityValues.length; i++) {
if (Integer.valueOf(quantityValues[i]).intValue() == item
.getProductQuantity()) {
return i;
}
}
Log.e(ServiceManager.TagOSDShop,
"findSelection returned invalid position!!!");
return -1;
}
static class ViewHolder {
public TextView tv_row_cart_title;
public TextView tv_row_cart_color;
public TextView tv_row_cart_size;
public TextView tv_row_cart_price;
public TextView tv_row_cart_details;
public ImageButton ib_row_cart_delete;
public ImageView iv_row_cart_content;
public Spinner spin_row_cart_quantity;
public ViewHolder(View convertView) {
tv_row_cart_title = (TextView) convertView
.findViewById(R.id.tv_row_cart_title);
tv_row_cart_color = (TextView) convertView
.findViewById(R.id.tv_row_cart_color);
tv_row_cart_size = (TextView) convertView
.findViewById(R.id.tv_row_cart_size);
tv_row_cart_price = (TextView) convertView
.findViewById(R.id.tv_row_cart_price);
tv_row_cart_details = (TextView) convertView
.findViewById(R.id.tv_row_cart_details);
ib_row_cart_delete = (ImageButton) convertView
.findViewById(R.id.ib_row_cart_delete);
iv_row_cart_content = (ImageView) convertView
.findViewById(R.id.iv_row_cart_content);
spin_row_cart_quantity = (Spinner) convertView
.findViewById(R.id.spin_row_cart_quantity);
}
}
顺便说一句,我的微调器有一些常数值,比如 1,2,.. 20。