0

getView()アプリケーションの 1 つのフラグメントでは、アイテムをデータベース (Cart クラス) に追加し、次の方法 (メソッドのみ)でリストビューの editText をキャッチします。

public View getView(int position, View convertView,final ViewGroup parent) {
View v = convertView;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater) getActivity()
                           .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.layout_product, null);

final Button addToCart = (Button) v.findViewById(R.id.button_addToCart);
                addToCart.setTag(position);

addToCart.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Fetch product id
                int position = (Integer) v.getTag();
                // Fetch amount of product
                LinearLayout rowLayout = (LinearLayout) v.getParent();
                EditText editText_amount = (EditText) rowLayout
                        .findViewById(R.id.editText_amount);
                try {
                    int amount = Integer.parseInt(editText_amount.getText()
                            .toString());
                    String k = Integer.toString(amount); 
            Toast.makeText(getActivity(),k,Toast.LENGTH_SHORT).show();

                    Cart.AddToCart(products.get(position), amount);

                } catch (NumberFormatException e) {
                    return;
                }
            }

Cart クラス (データベース) :

public class Cart {
static HashMap<Integer, JSONObject> products = new HashMap<Integer, JSONObject>();

public static void AddToCart(JSONObject product, int amount) {
    int product_id;

    try {
        product_id = product.getInt("product_id");
        product.put("product_id", amount);
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return;
    }

    products.put(product_id, product);
}

public static void ExcludeFromCart(JSONObject product, int amount) {
    int product_id;

    try {
        product_id = product.getInt("product_id");
        product.put("product_id", amount);
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return;
    }

    products.remove(product_id);
}

public static JSONObject[] GetProducts()
{
    return products.values().toArray(new JSONObject[products.size()]);
}
}

そして、Cart クラスに追加されたアイテムのリストビューを作成して処理するフラグメント (getView()メソッドのみ):

public View getView(int position, View convertView,
            final ViewGroup parent) {
        ViewGroup p=parent;
        View v = convertView;
        if (v == null) {

            LayoutInflater vi = (LayoutInflater) getActivity()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.layout_cart, null);
Button remove = (Button) v.findViewById(R.id.remove);
        remove.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Fetch product id
                int position = (Integer) v.getTag();
                String k = Integer.toString(position);

                Toast.makeText(getActivity(),k,Toast.LENGTH_SHORT).show();
                // Fetch amount of product
                LinearLayout rowLayout = (LinearLayout) v.getParent();
                EditText editText_amount = (EditText) rowLayout
                        .findViewById(R.id.editText_amount_cart);
                try {
                    int amount = Integer.parseInt(editText_amount.getText()
                            .toString());

                    Cart.ExcludeFromCart(products.get(position), amount);
                    v.invalidate();
                    notifyDataSetChanged();
                } catch (NumberFormatException e) {
                    return;
                }

            }
        });

問題は、時々(常にではなく、もっと奇妙になります)カートに複数のアイテムを追加でき(もちろんそれを避けたい)、削除ボタンを押しても何も起こらないことです(listViewのアイテムはそうではありません削除されました)。あなたの援助に感謝します!

4

1 に答える 1

0

この問題の原因として最も可能性が高いのは、convertView. あなたのコードは、convertView渡された がパラメーターとgetView一致すると想定していpositionますが、これは間違った想定です。

この仮定を検証するために、(両方の getViews で)View v = convertView;を? に置き換えることができますView v = null;か? (したがって、convertViewを使用していません)

これが正しく機能する場合は、vi.inflate の後に (両方の getView で) すべてを周囲の if ステートメントの外側に配置することをお勧めします。したがって、タグを正しい値に再度設定しています。

于 2012-11-06T08:46:20.730 に答える