2013-01-17 15 views
14

Chcę rysować selektor na długie naciśnięcie, jak pokazano na rysunku. Po długim naciśnięciu jednego elementu menu CAB zostanie uaktywnione. Ale wskaźnik wyboru listy wyłącza się po kliknięciu. Chcę, żeby selektory list były aktywne, dopóki menu CAB nie będzie aktywne, aby umożliwić wielokrotny wybór. Kolor powinien się przełączyć, jeśli dwukrotnie dotknę. Ten kod działa jak migotanie, gdy go klikam. Ktoś z kim zmierzył się w podobny sposób? Czy jest jakiś hack, aby przynieść tę funkcjonalność?Selektor listy przedmiotów w GridView dla wielu produktów nie działa w systemie Android.

GridView z wielokrotnego wyboru:

enter image description here

GridView setchoice w moim onCreate:

gridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL); 
gridView.setMultiChoiceModeListener(new MultiChoiceModeListener()); 

to działa dobrze:

gridView.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View v, 
      int position, long id) { 

    ImageView iv = (ImageView) v 
         .findViewById(R.id.imageview2); 
       ViewGroup gridChild = (ViewGroup) gridView 
         .getChildAt(position); 
       ViewGroup gridGrandChild = (ViewGroup) gridChild 
         .getChildAt(0); 
       ViewGroup gridGreatGrandChild = (ViewGroup) gridGrandChild 
         .getChildAt(0); 
       int childSize = gridGreatGrandChild.getChildCount(); 
       if (iv.getId() == gridGreatGrandChild.getChildAt(1) 
         .getId()) { 
        if (iv.getVisibility() == 4) 
         iv.setVisibility(View.VISIBLE); 
        else 
         iv.setVisibility(View.INVISIBLE); 
       } 
}}); 

Staram się realizować takie same kod wewnątrz klasy MultiChoiceModeListener() af ter menu CAB jest aktywne. Skopiowano ten sam kod w metodzie, co metoda

public void onItemCheckedStateChanged(ActionMode mode, int position, 
      long id, boolean checked) { 
} 
. Ale nie mogę uzyskać dostępu do elementów wewnątrz grupy widoku. Ale jestem w stanie uzyskać dostęp do GridView w całości. Ale nie pojedyncze dziecko w Sieci.

Oto mój gridview układ:

<GridView 
      android:id="@+id/grid_view" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:columnWidth="190dp" 
      android:drawSelectorOnTop="true" 
      android:choiceMode="multipleChoice" 
      android:horizontalSpacing="3dp" 
      android:listSelector="@drawable/list_selector" 
      android:numColumns="auto_fit" 
      android:paddingRight="4dp" 
      android:stretchMode="spacingWidthUniform" 
      android:verticalSpacing="3dp" > 
     </GridView> 

Każda pozycja w GridView jest wykonana z tego układu:

<FrameLayout 
    android:id="@+id/frameLayout1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" > 

    <RelativeLayout 
     android:id="@+id/relativelayout" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 

     <ImageView 
      android:id="@+id/imageview" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" > 
     </ImageView> 

     <ImageView 
      android:id="@+id/imageview2" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignBottom="@+id/imageview" 
      android:layout_alignLeft="@+id/imageview" 
      android:layout_alignRight="@+id/imageview" 
      android:layout_alignTop="@+id/imageview" 
      android:visibility="invisible" 
      android:background="#76f9a49c"    
      > 
     </ImageView> 
    </RelativeLayout> 

    <ImageView 
     android:id="@+id/tagimage" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="top|right" 
     android:layout_marginRight="-4dp" 
     android:src="@drawable/tag" 
     android:visibility="invisible" /> 

    <ImageView 
     android:id="@+id/countimage" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|right" 
     android:layout_marginBottom="8dp" 
     android:layout_marginRight="5dp" 
     android:src="@drawable/dealcount_overlay" 
     android:visibility="invisible" /> 

    <TextView 
     android:id="@+id/count" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|right" 
     android:layout_marginBottom="11dp" 
     android:layout_marginRight="24dp" 
     android:text="100" 
     android:textColor="#fff" 
     android:visibility="invisible" > 
    </TextView> 

    <ProgressBar 
     android:id="@+id/progressbar" 
     style="@android:style/Widget.ProgressBar.Small" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:layout_gravity="center" 
     android:visibility="visible" /> 
</FrameLayout> 

<TextView 
    android:id="@+id/textView_nodata" 
    android:layout_width="wrap_content" 
    android:layout_height="150dp" 
    android:layout_below="@+id/frameLayout1" 
    android:layout_centerHorizontal="true" 
    android:text="No data available. Try different query!" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:visibility="gone" /> 

</RelativeLayout> 

Oto moja list_selector.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

<item android:drawable="@color/gridviewlistselector" android:state_focused="true" android:state_pressed="false"/> 
<item android:state_focused="true"><shape> 
     <solid android:color="#66000000" /> 
    </shape></item> 
<item android:state_selected="true"><shape> 
     <solid android:color="#66000000" /> 
    </shape></item> 
<item android:state_pressed="true"><shape> 
     <solid android:color="#66000000" /> 
    </shape></item> 
<item android:state_enabled="false" android:state_focused="true"><shape> 
     <solid android:color="#66000000" /> 
    </shape></item> 

</selector> 

Jak mogę osiągnąć funkcjonalność? Utknąłem w tym. Próbowałem różnych kombinacji na selektorach. Ale nic nie działa dla mnie. Czy muszę podać jakieś inne szczegóły?

Odpowiedz

1

nie jestem pewien, że to rozwiązanie prawo, ale ustawienie to dla android:background na mojej liście rzeczy:

<selector xmlns:android="http://schemas.android.com/apk/res/android" 
     android:exitFadeDuration="@android:integer/config_mediumAnimTime" > 

    <!-- I never see this one - the grid items are not focusable --> 
    <item android:state_pressed="false" android:state_focused="true" android:drawable="@drawable/list_focused" /> 

    <!-- while pressed --> 
    <item android:state_pressed="true" android:drawable="@drawable/pressed_background" /> 

    <!-- while selected in actionmode --> 
    <item android:state_activated="true" android:drawable="@color/pressed" /> 

    <item android:drawable="@android:color/transparent" /> 
</selector> 

nie ustawić atrybut android:listSelector na widoku siatki.

+0

Ale muszę rozwiązanie tylko dla elementów listSelector w moim GridView – intrepidkarthi

+0

to działa na wielu wybrać? – intrepidkarthi

+0

Tak. Żaden inny kod nie był wymagany. 'CHOICE_MODE_MULTIPLE_MODAL' podobny do Twojego. Ponadto pominąłem atrybuty "android: choiceMode" i "android: drawSelectorOnTop". – dokkaebi

0

W tym celu należy zmienić widok siatki, kolor tła na pojedyncze/długie kliknięcie.

Poniżej znajduje się kod referencyjny, na to samo:

GridView.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     mAdapter.setSelected(position,true);           
     view.setBackgroundColor(Color.XYZ); 
    } 
} 

Nadzieja ta pomoc jest. Dzięki.

+0

Potrzebuję przezroczystej nakładki na górze. Nie na tle. – intrepidkarthi

+0

Nie musisz wywoływać setBackgroundColor, ale pamiętaj, że tło twojego widoku powinno być przezroczyste (aby uzyskać nakładkę na wierzchu). Po wywołaniu funkcji setSelected() widok siatki powinien wybrać element zgodnie z selektorem XML. –

0

Podaj dopełnienie w elemencie siatki. Utrzymanie klasy komponentu bean dla każdego obiektu w adapterze siatki do zaznaczenia lub odznaczenia obiektu śledzenia. Na podstawie tej wartości można zaktualizować kolor tła elementu siatki według stanu wybranego/niezaznaczonego. Zaktualizuj wartość obiektu w onitemclieck listner, a także zobacz tło.

0

Można to osiągnąć, śledząc wybrane elementy i zmieniając ich tło wewnątrz adaptera.

Chyba dostaniesz trochę pomocy od this post