2015-07-01 21 views
12

Tôi đang làm việc trên một mô-đun điền vào giỏ hàng. Tôi đã sử dụng ListView và mở rộng BaseAdapter để điền các mục giỏ hàng. Với mỗi mục trong ListView, tôi đã nhúng hai nút (inc và dec) vào số lượng tăng và giảm của mặt hàng trong giỏ hàng.Android- Các nút liền nhau trong chế độ xem danh sách được tự động nhấp vào

ListView được cập nhật chính xác, nhưng nút tăng/giảm trên nhấp nhanh/khai thác thể hiện hành vi đột ngột.

Bất cứ khi nào tôi nhanh chóng khai thác bất kỳ inc hoặc nút Tháng Mười Hai, các inc tương ứng hoặc nút tháng mười hai của một mục bên cạnh mục hiện tại ListView được tự động nhấp (cùng với btn mục hiện hành).

Nói cách khác, bất cứ khi nào tôi nhanh chóng nhấn inc btn của mục thứ i trong ListView, inc btn của mục i + 1 trong ListView được tự động nhấp (cùng với inc btn của mục thứ i).

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.list_item_cart, parent, false); 
     holder = new ViewHolder(); 
     holder.baseItem = (TextView) convertView.findViewById(R.id.qnt_tv); 
     holder.qntInc = (TextView) convertView.findViewById(R.id.inc_btn); 
     holder.qntDec = (TextView) convertView.findViewById(R.id.dec_btn); 

     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    final CartModel cm = mCart.get(position); 
    holder.baseItem.setText(cm.getmTitle()); 
    holder.qntSel.setText(String.valueOf(cm.getmQnt())); 
    holder.qntInc.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      if (qntSpinnerCb != null) 
       qntSpinnerCb.changeQuantityOfSelectedItemInCart(cm.getmIid(), INCREASE_QNT); 
     } 
    }); 
    holder.qntDec.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      if (qntSpinnerCb != null) { 
       qntSpinnerCb.changeQuantityOfSelectedItemInCart(cm.getmIid(), DECREASE_QNT); 
      } 
     } 
    }); 

    return convertView; 
} 

Interface cho callback

public interface CartQntSpinnerListenerCallBack { 
    void changeQuantityOfSelectedItemInCart(String iId, char changeType); 
} 

Cố gắng gỡ lỗi, không thể tìm ra hành vi kỳ lạ này.

+0

Bạn nhấn mạnh cụm từ "nhấn nhanh". Vì vậy, khi bạn nhấn các nút từ từ hoặc chỉ khi mục lân cận không được nhấp? – Androidicus

+0

"baseItem" có chiều rộng cố định không? Vị trí của nút Inc/Dec có thể thay đổi sau khi changeQuantityOfSelectedItemInCart() và nó gây ra hành vi đột ngột .. Tôi đoán vậy. (Hoặc khai thác trong khi thay đổi bố cục) – Toris

+0

Thêm mã cho 'qntSpinnerCb' và bất kỳ mã nào đang chạm vào. Các trường hợp 'OnClickListener()' có vẻ hợp lý. –

Trả lời

-1

Có sự cố trong mã.

if (convertView == null) { 
    convertView = mInflater.inflate(R.layout.list_item_cart, parent, false); 
    holder = new ViewHolder(); 
    holder.baseItem = (TextView) convertView.findViewById(R.id.qnt_tv); 
    holder.qntInc = (TextView) convertView.findViewById(R.id.inc_btn); 
    holder.qntDec = (TextView) convertView.findViewById(R.id.dec_btn); 

    // This should be added in the code 
    holder.qntSel = (TextView) convertView.findViewById(R.id.sec_txt); 

    convertView.setTag(holder); 
} else { 
    holder = (ViewHolder) convertView.getTag(); 
} 
+1

Lý do bỏ phiếu xuống là gì ? Phản hồi dựa trên đầu vào được cung cấp. Nếu mọi thứ nên được giả định/hiểu mà không biện minh hơn tất cả mọi người nên được (hơn) các chuyên gia ở đây và không cần sự giúp đỡ. Buồn .. –

9

Bạn chưa chọn đúng CartModel bên onClick, nếu bạn muốn để có được đúng đối tượng bên trong onclick sau đó bạn có gắn thẻ vị trí để nút

holder.qntInc.setTag(position); 

trong onClick:

@Override 
public void onClick(View view) { 
    if (qntSpinnerCb != null) { 
     CartModel cm= mCart.get((Integer)view.getTag); 
     qntSpinnerCb.changeQuantityOfSelectedItemInCart(cm.getmIid(), INCREASE_QNT); 
    } 
} 

Làm tương tự cho qntDec.

-1

Phương thức getter của bạn getmIid() trong CartModel có vấn đề tôi nghi ngờ. Phương pháp này trả về chỉ mục sai và vì vậy nút tiếp theo/trước đó của bạn đang cập nhật

Tôi đề nghị sử dụng position số nguyên trong gọi lại của bạn changeQuantityOfSelectedItemInCart() thông số đầu tiên. Bởi vì vị trí sẽ luôn đến một cách chính xác với getView() callback

SOLUTION:

holder.qntInc.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     if (qntSpinnerCb != null) 
      qntSpinnerCb.changeQuantityOfSelectedItemInCart(position+"", INCREASE_QNT); 
     } 
    }); 
    holder.qntDec.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     if (qntSpinnerCb != null) 
      qntSpinnerCb.changeQuantityOfSelectedItemInCart(position+"", DECREASE_QNT); 
     } 
    }); 

Các positionint loại và gọi lại của bạn cần String vì vậy chúng tôi nên sử dụng position+""

Hy vọng điều này sẽ làm việc cho bạn

+0

Lý do để giải quyết câu trả lời là gì? Không cần thiết phải giảm bớt mọi câu trả lời cho câu hỏi này .. – Kushal

3

Nếu bạn muốn tiếp tục triển khai hiện tại, hãy thực hiện việc này.

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
if (convertView == null) { 
    convertView = mInflater.inflate(R.layout.list_item_cart, parent, false); 
} 

ViewHolder holder = new ViewHolder(); 

holder.baseItem = (TextView) convertView.findViewById(R.id.qnt_tv); 
holder.qntInc = (TextView) convertView.findViewById(R.id.inc_btn); 
holder.qntDec = (TextView) convertView.findViewById(R.id.dec_btn); 


... 

Nếu không thấy phần còn lại của mã, tôi nghĩ bạn có thể muốn xem xét lại cách bạn đang triển khai BaseAdapter. Theo truyền thống, chúng được sử dụng kết hợp với chế độ xem danh sách để tái chế chế độ xem cho hiệu quả.Điều này có nghĩa là khi một danh sách cuộn một khung nhìn ra khỏi khung, thay vì vẽ lại khung nhìn - nếu (convertView == null) - nó sẽ tái sử dụng nó. Điều tôi nghĩ bạn đang trải qua là bạn đang đặt trình nghe nhấp chuột cho hai đối tượng khác nhau trên cùng một nút.

Những gì tôi sẽ khuyên bạn nên làm là một cái gì đó như thế này:

@Override 
public int getCount() { 
    return objects.size(); 
} 

@Override 
public CartModel getItem(int position) { 
    // mCart sounds like a single item but is a list? I advise you to rename 
    return objects.get(position); 
} 

@Override 
public long getItemId(int position) { 
    // Implement with id. Copied the id call from your code.. 
    return getItem(position).getmIid(); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.list_item_cart, parent, false); 
    } 

    CartModel cm = getItem(position); 

    TextView baseItem = (TextView) convertView.findViewById(R.id.qnt_tv); 
    baseItem.setText(cm.getmTitle()); 

    // Organize like items together for readability 
    TextView qntInc = (TextView) convertView.findViewById(R.id.inc_btn); 
    qntInc.setTag(mCartKey, cm); 
    qntInc.setOnClickListener(this); 

    // readability 
    TextView qntDec = (TextView) convertView.findViewById(R.id.dec_btn); 
    qntDec.setTag(mCartKey, cm); 
    qntDec.setOnClickListener(this); 


    // Defined in convert view? 
    qntSel.setText(String.valueOf(cm.getmQnt())); 


    return convertView; 
} 

@Override 
public void onClick(View v) { 

    switch(v.getId()){ 
     case R.id.R.id.inc_btn: 
      CartModel cm = (CartModel)v.getTag(mCartKey); 
      // What is this? 
      if (qntSpinnerCb != null) 
       qntSpinnerCb.changeQuantityOfSelectedItemInCart(cm.getmIid(), INCREASE_QNT); 

      break; 


     case R.id.dec_btn: 

      CartModel cm = (CartModel)v.getTag(mCartKey); 
      if (qntSpinnerCb != null) { 
       qntSpinnerCb.changeQuantityOfSelectedItemInCart(cm.getmIid(), DECREASE_QNT); 
      } 
      break; 
    } 

} 

LƯU Ý: lớp BaseAdapter phải thực hiện OnClickListener

1

cửa hàng vị trí của cái nhìn của bạn trong viewholder của bạn và sử dụng nó mọi nơi trong setonclicklistner từ viewHolder vị trí đó bạn sẽ không thấy bất kỳ hành vi vô lý nào, nó sẽ hoạt động như bạn muốn

static class ViewHolder { 
    TextView baseItem, qntInc, qntDec; 
    ....../* your code goes here */ 
    int position 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.list_item_cart, parent, false); 
     holder = new ViewHolder(); 
     holder.baseItem = (TextView) convertView.findViewById(R.id.qnt_tv); 
     holder.qntInc = (TextView) convertView.findViewById(R.id.inc_btn); 
     holder.qntDec = (TextView) convertView.findViewById(R.id.dec_btn); 
     holder.position=position 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
     holder.position=position; 
    } 
    CartModel cm = mCart.get(holder.position); 
    holder.baseItem.setText(cm.getmTitle()); 
    holder.qntSel.setText(String.valueOf(cm.getmQnt())); 
    holder.qntInc.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      CartModel cm = mCart.get(holder.position); 
      qntSpinnerCb.changeQuantityOfSelectedItemInCart(cm.getmIid(), INCREASE_QNT); 
     } 
    }); 

    holder.qntDec.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      CartModel cm = mCart.get(holder.position); 
      qntSpinnerCb.changeQuantityOfSelectedItemInCart(cm.getmIid(), DECREASE_QNT); 

     } 
    }); 

    return convertView; 
} 

cũng kiểm tra giá trị của INCREMENT_QNTDECREACE_QNT

+0

y có u bình chọn giải pháp này được thử nghiệm n mã làm việc và cũng được sử dụng trong trang web của nhà phát triển Android trên liên kết này (http: // developer.android.com/training/improving-layouts/smooth-scrolling.html) để cập nhật cho dude trước khi bỏ phiếu xuống giải pháp –

+0

Hey, thanka .. hoạt động tốt cho tôi .. – Abhi

Các vấn đề liên quan