0

ベースアダプターから拡張されたカスタムアダプターがあり、各行内にスピナーがあります(各製品の数量に関連するもの->リストビューのアイテム)。ユーザーがスピナーの別の値を選択すると、合計価格を示す TextView を更新する必要があります (その行の TextView -- productQuantity * productPrice )。問題は、spinner.setOnItemClickListener で notifyDataSetChanged を呼び出すと、リストビューが完全に台無しになり、フレームが大幅に低下することです。この問題を解決するための(おそらく他の)解決策はありますか..(アダプターgetView内の1行を更新することを探していましたが、適切な解決策が見つかりませんでした)。

アダプタ

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

アダプターでリスナーを作成し、それをアクティビティに実装する必要があります。その後、アクティビティからlistview.getChildAt(position)メソッドを呼び出して、必要に応じてビューを更新できます。

インターフェイスを使用してリスナーを実装できますが、アクティビティはインターフェイスを実装する必要があります。

于 2013-04-29T08:04:05.920 に答える
0

このリンクを参照してください。
あなたに役立つかもしれません

于 2013-04-26T09:25:53.320 に答える