2016-08-25 7 views
5

Mam 2 wyskakujące okienka. Na pierwszym wyskakującym okienku mam ListView z opcjami do wyboru. Kiedy klikam element z pierwszej listy, pojawiają się drugie wyskakujące okienko, które ma również ListView z opcjami do wyboru.Zdarzenie onClick nie działa w przypadku kontrolki elementu zagnieżdżonej listy w Androidzie

I zostały wdrożone pierwsze elementy listy Zobacz w formie zwyczaju View i subskrybowania kliknięć wewnątrz widzenia konstruktora, tak jak:

class CustomListItem extends RelativeLayout{ 
    public CustomListItem(){ 
     ... 
     //inflating stuff there 
     ((Button)findViewById(R.id.listItemButton)).setOnClickListener(
      //This code not working as expected, but then could fire a lot of times 
      v -> System.out.println("item clicked"); 
     ); 
    } 
} 

Kiedy otwieram pierwsze okno po raz pierwszy onClick pożarów procedur obsługi, jak oczekiwano, a drugie okienko pojawia się. Ale kiedy zamykam drugie wyskakujące okienko i wracam (wywołując Dialog.dismiss() dla wyskakującego okienka) do pierwszego wyskakującego okienka, to obsługa onClick na pierwszym widoku listy przestaje działać. Istnieje kilka innych rzeczy inetersting:

  1. onTouch słuchacz do widoku listy pozycji nadal pracuje (zwany dla action=ACTION_DOWN i action=ACTION_UP);
  2. kiedy ustawiam na listę publiczną onItemClickListener nazywa się zawsze (pierwszy raz, gdy wyskakujące okienko jest otwarte i kiedy wracamy do niego);
  3. po kliknięciu wiele razy na pozycję w widoku listy, zdarza się czasem onClick , a następnie jest wywoływana tyle razy, ile wcześniej kliknąłem .

Czy masz jakieś pomysły, co może być przyczyną problemu?

UPDATE

Wydaje się, że istnieje problem z getView metody wewnątrz adaptera. Próbowałem stworzyć kontrolę elementu listy niestandardowe wewnątrz niego (lub dostać go z pamięci podręcznej):

@Override 
public View getView(int position, View view, ViewGroup parent) { 
    if (!constructedViewCache.containsKey(position)) { 
     constructedViewCache.put(position, new CustomListItem()); 
    } 

    return constructedViewCache.get(position); 
} 

Kiedy zmienił ten kod do kodu poniżej wszystko działa:

@Override 
public View getView(int position, View view, ViewGroup parent) { 
    if (view == null) 
    { 
     view = LayoutInflater.from(context).inflate(R.layout.list_view_item, null); 
    } 

    view.setOnClickListener(v -> { 
     v -> System.out.println("item clicked"); 
    }); 

    return view; 
} 

Dlaczego to nie jest można utworzyć widok z new CustomListItem()? A jeśli to możliwe, jak mam to zrobić?

+0

Am I rozumiem, że onclick nie pracował prawidłowo, ale jeśli kliknięciu wiele razy, powiedzmy 20-30 Mogło ogień i po tym kodzie dla onclick zostanie wykonany 20-30 razy? –

+0

czy możesz udostępnić więcej kodu? –

+0

@vovaxo pełny kod jest bardzo skomplikowany. która część kodu może ci się przydać? – Natasha

Odpowiedz

0

Spróbuj wstawić atrybut android:descendantFocusability="blocksDescendants" do deklaracji układu macierzystego elementu listy, w którym znajduje się listItemButton.

Gdzie atrybut android:descendantFocusability

Określa relację między ViewGroup i jego potomkom przy poszukiwaniu celu podjęcia ostrość.

i stałej blocksDescendants oznacza, że:

ViewGroup zablokuje jego potomków z otrzymywania ostrość.

Drugie pytanie

Jest możliwe, aby utworzyć widok z nowym CustomListItem(). Zobacz poniższy przykład:

@Override 
public View getView(int i, View view, ViewGroup viewGroup) { 
    return new CustomListItem(context); 
} 

EDIT

nie widzę swój pełny kod, wygląda na to, że coś się stało. Tutaj pracuje przykład spojrzeć na:

public class CustomAdapter extends BaseAdapter { 
private Context context; 
private HashMap<Integer, CustomListItem> constructedViewCache = new HashMap<>(); 

public CustomAdapter(Context context) { 
    this.context = context; 
} 

@Override 
public int getCount() { 
    return 20; 
} 

@Override 
public Object getItem(int i) { 
    return null; 
} 

@Override 
public long getItemId(int i) { 
    return 0; 
} 

@Override 
public View getView(int position, View view, ViewGroup viewGroup) { 
    if (!constructedViewCache.containsKey(position)) { 
     constructedViewCache.put(position, new CustomListItem(context, position)); 
    } 
    return constructedViewCache.get(position); 
} 
} 

i drugie klasy:

public class CustomListItem extends RelativeLayout { 
private static final String TAG = "CustomListItem"; 

public CustomListItem(Context context, int position) { 
    super(context); 

     View view = LayoutInflater.from(context).inflate(R.layout.item_view, this); 
    Button button = (Button) view.findViewById(R.id.button); 
    button.setOnClickListener(view1 -> { 
     Log.e(TAG, "CustomListItem: " + position); 
     FragmentManager fragmentManager = ((AppCompatActivity) context).getSupportFragmentManager(); 
     new CustomDialog().show(fragmentManager, "tag"); 
    }); 

} 
} 

EDIT 2

zaktualizowałem CustomListItem aby wyświetlić okno dialogowe, gdy przycisk zostanie kliknięty. Jest kod niestandardowy DialogFragment która wykorzystuje listę elementów samym układzie jak i adapter działalności:

public class CustomDialog extends DialogFragment { 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.activity_main, container, false); 
    ListView listView = (ListView) view.findViewById(R.id.list); 
    listView.setAdapter(new CustomAdapter(getActivity())); 
    return view; 
} 
} 
+0

'android: descendantFocusability' nie wpływa na wynik, ale twoja druga sugestia z tworzeniem' new CustomListItem() 'działa normalnie i nie" łamie "kliknięć. Nadal nie rozumiem przyczyny problemu: dlaczego elementy pamięci podręcznej powodują problem z kliknięciami? – Natasha

+0

Sprawdziłem twój kod. Robię dokładnie to samo. Czy próbowałeś tego z dialogiem? Mam pierwszy dialog z listą i przyciskiem, który otwiera kolejne okno dialogowe i kiedy wracamy z drugiego okna dialogowego, pierwsze kliknięcia przestają działać. Początkowo działają perfekcyjnie (oba okna dialogowe pełnoekranowe - nie wiem czy to ważne) – Natasha

+0

Z dialogiem działa dobrze dla mnie. –

Powiązane problemy