2013-01-17 15 views
14

Desidero disegnare il selettore su una pressione prolungata come mostrato nell'immagine. Quando eseguo una pressione prolungata su un elemento, viene attivato il menu CAB. Ma l'indicatore del selettore di lista si spegne una volta dopo aver fatto clic. Voglio che i selettori di lista siano attivi finché il menu CAB non è attivo per consentire selezioni multiple. E il colore dovrebbe alternarsi se faccio doppio tocco. Questo codice funziona come uno sfarfallio quando faccio clic su di esso. Qualcuno ha affrontato una cosa simile? C'è un trucco per portare questa funzionalità?GridView Selettore elenco oggetti per più elementi che non funzionano in Android

GridView con selezione multipla:

enter image description here

GridView setchoice nel mio OnCreate:

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

Questo sta lavorando bene:

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

Sto cercando di implementare la stessa codice all'interno della classe MultiChoiceModeListener() af il menu CAB è attivato. Copiato lo stesso codice all'interno di

public void onItemCheckedStateChanged(ActionMode mode, int position, 
      long id, boolean checked) { 
} 

metodo. Ma non riesco ad accedere agli elementi all'interno del viewgroup. Ma sono in grado di accedere al GridView per intero. Ma non il singolo bambino all'interno della griglia.

Ecco il mio layout di GridView:

<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> 

Ogni elemento della GridView è costruito con questo layout:

<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> 

Ecco il mio 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> 

Come posso ottenere la funzionalità? Mi sto bloccando in questo. Ho provato varie combinazioni su Selectors. Ma niente sembra funzionare per me. Devo fornire altri dettagli?

risposta

1

io non sono sicuro che sia la soluzione giusta , ma impostare questo per il android:background sulle voci di elenco:

<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> 

non ho impostato l'attributo android:listSelector sulla visualizzazione a griglia.

+0

Ma ho bisogno di una soluzione solo per gli elementi listSelector nel mio GridView – intrepidkarthi

+0

sta funzionando per il multi selezionare? – intrepidkarthi

+0

Sì. Non era richiesto nessun altro codice "CHOICE_MODE_MULTIPLE_MODAL" come il tuo. Inoltre, ho omesso gli attributi 'android: choiceMode' e' android: drawSelectorOnTop'. – dokkaebi

0

Per questo è necessario modificare Grid View Item, BackgroundColor con clic singolo/lungo.

Di seguito si riporta il codice di riferimento, per la stessa:

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

Spero che questo aiuto di. Grazie.

+0

Ho bisogno di una sovrapposizione trasparente sulla parte superiore. Non sullo sfondo – intrepidkarthi

+0

Quindi non è necessario chiamare setBackgroundColor, ma ricordarsi che lo sfondo della vista dovrebbe essere trasparente (per ottenere la sovrapposizione in primo piano). Dopo aver chiamato setSelected(), la vista Grid dovrebbe selezionare l'elemento in base al selettore XML. –

0

Assegna il riempimento alla griglia. Mantenere la classe bean per ogni oggetto nell'adattatore di rete per tenere traccia dell'oggetto selezionato o non selezionato. In base a questo valore è possibile aggiornare il colore dello sfondo dell'elemento griglia acc a stato selezionato/non selezionato. Aggiorna il valore dell'oggetto nel listener onitemclieck e visualizza anche lo sfondo.

0

questo può essere ottenuto rintracciando gli articoli selezionati e cambiando i loro sfondi all'interno dell'adattatore.

Credo che si otterrà poco aiuto da this post