2011-07-12 11 views
5

Spędziłem dosłownie dwa dni próbując rozwiązać ten problem. Gdyby ktokolwiek mógł mi pomóc, byłbym ogromnie wdzięczny.Własny widok listy z dwoma przyciskami w każdym wierszu

Co usiłuję osiągnąć:

Have ListView, dzięki czemu gracz może dodawać nowe wpisy (graczy) przez pole tekstowe (imię gracza), a następnie przycisk Prześlij. W każdym polu listy ListView wyświetlam nazwę gracza, a następnie dwa przyciski ImageButtons. Jedna z symbolem męskim i jedna z symbolem żeńskim. Symbol męski jest domyślnie przełączany, a użytkownik może ustawić odtwarzacz jako męski lub żeński, przełączając przycisk męski lub żeński. Wreszcie, gdy użytkownik przejdzie do następnego ekranu (nowej aktywności), aplikacja zapisze nazwiska graczy i przypisaną płeć w jakiejś formie przechowywania i przejdzie do następnej czynności.

Co udało mi się osiągnąć:

mam prosty adapter tablicy, która na odtwarzaczu dodanie nowej nazwy gracza do listy, uruchomić notifyDataSetChanged() na nim. Adapter jest również skonfigurowany do używania niestandardowego pliku układu wiersza. Wewnątrz pliku układu wygląda to tak:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" android:layout_height="wrap_content"> 
    <RelativeLayout android:layout_height="wrap_content" 
     android:layout_width="fill_parent" android:id="@+id/relativeLayout1" android:layout_marginTop="5dp"> 
     <TextView android:layout_width="wrap_content" 
      android:layout_height="wrap_content" android:id="@+id/playerName" 
      android:layout_centerVertical="true" android:text="Derp" android:textStyle="bold" android:layout_marginLeft="5dp" android:textSize="22dp" android:textColor="@color/male_blue"></TextView> 
     <ImageButton android:layout_height="60dp" 
      android:layout_width="60dp" android:onClick="maleClickHandler" 
      android:src="@drawable/male_icon_settings" android:id="@+id/buttonA" android:layout_alignParentRight="true" android:layout_marginRight="65dp"></ImageButton> 
     <ImageButton android:onClick="femaleClickHandler" 
      android:layout_height="60dp" android:layout_width="60dp" android:id="@+id/buttonB" 
      android:layout_alignParentRight="true" android:layout_marginRight="5dp" android:src="@drawable/female_icon_settings"></ImageButton> 
    </RelativeLayout> 
</LinearLayout> 

Dwa przyciski na każdym wierszu odnoszą się do metod w pliku klasy. Oto mój kod to:

public void maleClickHandler(View v) { 

     RelativeLayout vwParentRow = (RelativeLayout) v.getParent(); 
     ImageButton maleButton = (ImageButton) vwParentRow.getChildAt(1); 
     maleButton.setImageDrawable(getResources().getDrawable(
       R.drawable.male_icon_selected)); 
     vwParentRow.refreshDrawableState(); 
    } 

    public void femaleClickHandler(View v) { 

     RelativeLayout vwParentRow = (RelativeLayout) v.getParent(); 
     ImageButton femaleButton = (ImageButton) vwParentRow.getChildAt(2); 
     femaleButton.setImageDrawable(getResources().getDrawable(
       R.drawable.female_icon_selected)); 
     vwParentRow.refreshDrawableState(); 
    } 

nie wdrożyły jeszcze żadnych wzajemnych połączeń między tymi dwoma przyciskami, aby umożliwić tylko jeden jest aktywny w danej chwili, albo nawet untoggle jeden, ponieważ myślę, że może podejmować całkowicie niewłaściwe podejście.

Problem:

Po dodaniu nowych pozycji do listy, PO przełączenie jednego i/lub drugiego męski/żeński przyciski, robi się naprawdę buggy i/samica przełączana ikona mężczyzna może poruszać tak jak powinien, wraz z dołączonym łańcuchem gracza lub, co bardziej prawdopodobne, osoby, które się przełączyły, pozostaną w pierwszym rzędzie (pozycja tablicy 0 na liście), lub nawet przeniosą się na drugą pozycję listy, i kopiują się jako przełączane na rząd powyżej.

Jak możesz pomóc ...?

załączam obrazek poniżej mojego ekranu z emulatora, aby pomóc zilustrować moje punkty Screenshot!

myślę, że może trzeba użyć jakiejś formy niestandardowe adapter; Wiele czytałem na ten temat, ale nie mogę znaleźć niczego istotnego dla tego, co próbuję osiągnąć, więc gdybyś mógł wskazać mi właściwy kierunek, lub nawet spróbować złożyć najbardziej podstawowe rozwiązanie tego problemu. typ problemu, byłbym bardzo wdzięczny.

Wreszcie, kiedy to działa, która forma przechowywania byłaby najlepsza do przechowywania nazw graczy i ich płci? Chciałbym, aby użytkownik mógł zachować listę graczy po zamknięciu aplikacji i zrestartowaniu jej.

Dzięki za pomoc! :)

Odpowiedz

1

Będziesz musiał użyć adaptera niestandardowego, który sam w sobie powinien być w stanie śledzić flagę męską/żeńską dla każdego z jej wpisów.

Twoja metoda nie będzie działać, ponieważ stan przycisków jest zarządzany przez metodę getView adaptera. Nawet jeśli zmienisz je, kopiąc dzieci, następnym razem, gdy zostanie wywołana metoda getView, to zepsuje to.

+0

Dziękuję, podejrzewałam, że muszę coś z tym zrobić; dziękuję za wyjaśnienie tego pięknie :) –

1

Wiele z tego zależy od tego, ilu graczy oczekuje w grze. Jeśli jest to liczba, która prawdopodobnie zmieści się na jednym ekranie (lub bardzo blisko), ListView jest w rzeczywistości niepotrzebna. ListView s i adaptery nie są tak naprawdę wygodną metodą, jak i narzędziem poprawy wydajności. Zachowują tylko w pamięci to, co jest na ekranie i odtwarzają stare, już wyświetlane podczas przewijania - dlatego niektóre stany przycisków są kopiowane do różnych wierszy.

Istnieje kilka sposobów można to naprawić:

  • można napisać niestandardowy adapter siebie jak sugeruje Kumar Bibek. W tym adapterze należy zastąpić metodę getView(), aby upewnić się, że każdy przycisk ma prawidłowy stan za każdym razem, gdy wywoływana jest metoda.

  • Można też po prostu użyć ScrollView wypełniona kilka swoich wierszy ręcznie, jeśli nie masz wystarczająco dużo danych, aby uzasadnić za pomocą ListView. W ten sposób nie musiałbyś się martwić o to, że twoje wiersze są poddawane recyklingowi, a stany przycisków nie działają.

Ponadto, warto przyjrzeć się używając RadioGroup dla selektora płci (nie mogę myśleć o wiele lepsze wykorzystanie przycisków radiowych, ponieważ są one wykonane, aby wzajemnie się wykluczają).

Również zewnętrzny plik LinearLayout w pliku XML wiersza wygląda niepotrzebnie.

Jeśli chodzi o przechowywanie, można użyć bazy danych SQLite lub SharedPreferences. SharedPreferences nie wymaga konfiguracji, ale czuję, że baza danych SQLite jest bardziej dostosowana do twoich potrzeb.

+0

Dziękuję bardzo, myślę, że skorzystam z twoich rad z Radio Group i ScrollView. Wielkie dzięki! : D –

+0

Proszę bardzo. Kiedy otrzymasz odpowiedź, która Cię zadowala, powinieneś zawsze oznaczyć ją jako poprawną odpowiedź, klikając pusty znacznik wyboru obok niej. Po zadaniu kilku pytań "procent zaakceptowania" pojawi się na plakietce użytkownika, a wysoki odsetek zachęci inne osoby do zapewnienia jakości odpowiedzi. :) –

Powiązane problemy