2015-07-01 5 views
12

Ich arbeite an einem Modul, das Warenkorb füllt. Ich benutzte ListView und erweiterte BaseAdapter, um die Einkaufswagenelemente zu füllen. Mit jedem der Artikel in ListView, habe ich zwei Tasten (inc und dec) eingebettet, um die Menge des Artikels im Warenkorb zu erhöhen oder zu verringern.Android - Benachbarte Schaltflächen in der Listenansicht klicken automatisch

ListView wird korrekt aktualisiert, aber die Taste zum Erhöhen/Verringern der Geschwindigkeit beim schnellen Klicken/Antippen zeigt abruptes Verhalten.

Wenn ich schnell auf eine der Schaltflächen inc oder dec klicke, wird automatisch die entsprechende inc- oder dec-Schaltfläche eines Elements neben dem aktuellen Element in ListView angeklickt (zusammen mit dem aktuellen Element btn).

Mit anderen Worten, wenn ich schnell auf inc btn ith Artikel in ListView tippen, wird inc btn von i + 1 th Artikel in ListView automatisch angeklickt (zusammen mit inc btn ith Artikel).

@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; 
} 

Schnittstelle für Rückruf

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

Versuchen Debugging, nicht auf dieses seltsame Verhalten herauszufinden.

+0

Sie betonen den Begriff "schnelles Tippen". Also, wenn Sie die Tasten langsam oder nur einmal drücken, wird der angrenzende Gegenstand nicht angeklickt? – Androidicus

+0

Hat das "baseItem" eine feste Breite? Positionen von Inc/Dec-Schaltflächen können sich nach changeQuantityOfSelectedItemInCart() ändern und es verursacht abruptes Verhalten .. Ich denke. (Oder tippen Sie beim Ändern der Layouts) – Toris

+0

Fügen Sie den Code für 'qntSpinnerCb' und was auch immer es berührt. Die 'OnClickListener()' Instanzen scheinen vernünftig zu sein. –

Antwort

-1

Es gibt ein Problem im Code.

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

Was ist der Grund für den Grund für Down-Voting ? Die Antwort basiert auf der bereitgestellten Eingabe. Wenn Dinge ohne Begründung angenommen/verstanden werden sollten, dann sollten alle hier (über) Profis sein und brauchen keine Hilfe. Traurig .. –

9

Sie sind nicht korrekt CartModel innerhalb onClick Auswahl, wenn Sie Sie haben richtige Objekt innerhalb onclick erhalten wollen, dann Position

holder.qntInc.setTag(position); 

in onClick-Taste markieren:

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

Folgen Sie dem gleichen für qntDec.

-1

Ihre Getter-Methode getmIid() in CartModel hat Problem, das ich vermute. Diese Methode gibt einen falschen Index zurück und die nächste/vorherige Schaltfläche wird aktualisiert

Ich empfehle, position Integer in Ihrem Rückruf changeQuantityOfSelectedItemInCart() ersten Parameter zu verwenden. Da die Position kommen immer korrekt mit getView() Rückruf

LÖSUNG:

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); 
     } 
    }); 

Die position ist int Typ und Ihre Rückruf muss String so sollten wir position+""

Hoffnung verwenden, um dies für Sie arbeiten

+0

Was ist der Grund für die Ablehnung der Antwort? Atleast Kommentar sollte für weitere Änderungen in der Antwort hinzugefügt werden. Unnötig jede Antwort auf diese Frage downvoted. – Kushal

3

Wenn Sie Ihre aktuelle Implementierung beibehalten möchten, tun Sie dies.

@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); 


... 

Ohne den Rest des Codes zu sehen, aber ich glaube, Sie zu überdenken sollten, wie Sie BaseAdapter implementieren. Herkömmlicherweise werden sie in Verbindung mit einer Listenansicht verwendet, um Sichten effizient zu recyceln.Das bedeutet, wenn eine Liste eine Ansicht außerhalb des Rahmens scrollt, anstatt die Ansicht neu zu zeichnen - if (convertView == null) - wird sie wiederverwendet. Was ich denke, ist, dass Sie einen Klick-Listener für zwei verschiedene Objekte auf derselben Schaltfläche platzieren.

Was würde ich empfehlen, ist mehr zu tun etwas wie folgt aus:

@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; 
    } 

} 

HINWEIS: BaseAdapter Klasse muss OnClickListener implementieren

1

speichern die Position Ihrer Ansicht in Ihrem viewholder und es allenthalben in der setonclicklistner verwenden von viewHolder diese Position Sie kein absurdes Verhalten sehen wird es funktionieren, wie Sie

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; 
} 
wollen

Überprüfen Sie auch den Wert von INCREMENT_QNT und DECREACE_QNT

+0

y Sie haben diese Lösung gewählt Dies ist getestet n Arbeitscode und auch in Android Entwickler-Website auf diesem Link (http: // developer.android.com/training/improving-layouts/smooth-scrolling.html) updaten Sie sich, bevor Sie die Lösung abstimmen –

+0

Hey, danke .. funktioniert gut für mich .. – Abhi

Verwandte Themen