2016-08-09 7 views
-2

Ich versuche, eine benutzerdefinierte Listenansicht zu implementieren. Alles funktioniert gut, bis ich eine if() Anweisung innerhalb der getView() Methode verwendenZwei Einträge werden in der Listenansicht Android ausgewählt

Ohne die if() Zustand ein einzelnes Element ausgewählt wird, wenn ich einen Artikel auswählen, aber wenn ich die if() Bedingung hinzufügen, werden die Ansichten angezeigt richtig, aber zwei Elemente (Nicht- angrenzend) ausgewählt werden (1. und letztes 1. oder vorletztes, irgendeine solche Kombination).

View getView(...){ 
    .... 
    if (!item.getPriceTo().equals("")) 
       priceToTV.setText(item.getPriceTo()); 
      else 
       priceToTV.setText(item.getPriceFrom()); 
    return view; 
} 

Auch verwende ich die vorherige Ansicht Speichern der Auswahl zu zeigen, so dass die aktuelle Auswahl eine red_border hat und wenn es ein black_border ausgewählt wird, auf ihn .:

subItemsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
       Log.d("New Order", "........"); 
       if (previousViewOfSubItems != null && previousViewOfSubItems != view) { 
        previousViewOfSubItems.setBackgroundResource(R.drawable.black_border); 
        if (quantity.getText().toString().equals("xx") || quantity.getText().toString().equals("0")) { 
         viewForVisibility.setVisibility(View.GONE); 
         layoutForQuantity.setVisibility(View.GONE); 
        } 

       } 
       if (previousViewOfSubItems == view) 
        return; 
       previousViewOfSubItems = view; 
       previousViewOfSubItems.setBackgroundResource(R.drawable.red_border); 
       viewForVisibility = previousViewOfSubItems.findViewById(R.id.viewForVisibility); 
       viewForVisibility.setVisibility(View.VISIBLE); 
       layoutForQuantity = (LinearLayout) previousViewOfSubItems.findViewById(R.id.layoutForQuantity); 
       layoutForQuantity.setVisibility(View.VISIBLE); 
       quantity = (TextView) previousViewOfSubItems.findViewById(R.id.subTypeQuantity); 

      } 
     }); 
+0

seine beacause es Listenansicht Ansicht wieder verwendet Elemente anzuzeigen, sobald die erste Ansicht ist, die die gleiche Ansicht gescrollt aus wiederverwendet die Ansicht im unteren Bereich der Anzeige des Menüs Listenansicht. Vergleichen Sie nicht die Ansicht, sondern vergleichen Sie die Position der angeklickten Ansicht. –

Antwort

1

previousViewOfSubItems = view; scheint verursacht das Problem,

In Listviews mit Adapter sollten Sie vermeiden, Ansichtsinstanzen zu speichern, weil Ansichten von Adaptern wiederverwendet werden, so kann die Ansicht für zwei Zeilen identisch sein, anstatt Speichern der Instanz Instanzverwendung ViewHolder Design pattern verwenden und verwenden Sie Tagg g

0

ListViews recyceln die Ansichten in der Liste. Beim Scrollen werden Top Views wiederverwendet und Inhalt mithilfe der Methoden ersetzt.

Wenn Sie den Hintergrund auf Rot usw. setzen, verwenden Sie Else-Anweisungen, um ihn auf den Standard-Schwarzwert zurückzusetzen.

0

Da listview die Ansicht zum Anzeigen von Elementen wiederverwendet, wird die Ansicht nach dem Durchblättern der ersten Ansicht erneut verwendet, um die Ansicht am Ende der Listenansicht anzuzeigen. Vergleichen Sie statt die Ansicht zu vergleichen, die Position der Ansicht geklickt

1

Sie müssen ViewHolder-Muster verwenden und anzeigen, um jede Ansicht an anderer Position richtig zu identifizieren. ListView recycelt immer die Ansicht, anstatt die Ansicht immer wieder neu aufzublasen.

Sie können auf Android Training documentation beziehen, wie ViewHolder-Muster zu implementieren.

+0

Ja Ich weiß, dass ListView die Ansicht recycelt, aber dies ist das erste Mal, dass ich dieses Problem erlebt habe. –

+0

Es hängt von der Komplexität der Ansicht ab. Wenn Sie eine einfache Ansicht haben, tritt der Fehler möglicherweise nicht auf. Es ist jedoch ratsam, unter allen Umständen das Muster zu betrachten. –

+0

Das hat es für mich getan. –

0

Ich habe über dieses abnormale Verhalten in meinem blog auf Recyclerview erklärt, dass Sie dieses Problem lösen.

Verwendung pojo Klasse den Status zu erhalten und die Ansicht entsprechend aktualisieren

Verwandte Themen