0

我有一个从基础适配器扩展的自定义适配器,并且我在每一行内都有一个微调器(与每个产品的数量有关的东西 - >来自列表视图的项目)。当用户选择微调器的不同值时,我必须刷新显示总价的 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。

4

2 回答 2

0

请参阅此链接
可能对你有帮助

于 2013-04-26T09:25:53.320 回答
0

您需要在适配器中创建一个侦听器,然后在您的活动中实现它,然后您可以从您的活动中调用该listview.getChildAt(position)方法并根据需要刷新视图。

您可以使用接口实现侦听器,并且您的活动将需要实现该接口。

于 2013-04-29T08:04:05.920 回答