2015-11-04 24 views
7

Ho implementato SearchView + Recyclerview utilizzando questo su github. GITHUB
Il mio prossimo passo è quello di ottenere l'articolo sulla parte selezionata sul recyclerview.
Poi ho visto del codice che riportava il bambino su Recyclerview.
Il codice funziona quando getChildAt (index) = 0.
Ma quando inserisco indice = 12 o maggiore di quello.
Il programma si è bloccato.Recyclerview (articolo su Recyclerview)

mRecyclerView.setAdapter(mAdapter); 
     mRecyclerView.addOnItemTouchListener(
       new RecyclerItemClickListener(getContext(), new RecyclerItemClickListener.OnItemClickListener() { 
        @Override 
        public void onItemClick(View view, int position) { 
         final int valueThisIteration = position; 
         mRecyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
          @Override 
          public void onGlobalLayout() { 
           TextView textViewDrawerTitle = (TextView) mRecyclerView.getChildAt(valueThisIteration).findViewById(R.id.tvText); 
           textViewDrawerTitle.setText("Checked"); 
           mRecyclerView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
          } 
         }); 

        } 
       }) 
     ); 

E ho ottenuto questo errore.

11-04 09:36:02.818 1629-1629/? E/AndroidRuntime: FATAL EXCEPTION: main 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime: Process: com.thesis.juandirection.juandirectionfinale, PID: 1629 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at com.thesis.juandirection.juandirectionfinale.fragments.FragmentSearch$1$1.onGlobalLayout(FragmentSearch.java:94) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at android.view.ViewTreeObserver.dispatchOnGlobalLayout(ViewTreeObserver.java:815) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1867) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5779) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at android.view.Choreographer.doCallbacks(Choreographer.java:580) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at android.view.Choreographer.doFrame(Choreographer.java:550) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at android.os.Handler.handleCallback(Handler.java:739) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:95) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:135) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:5221) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Native Method) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Method.java:372) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
+0

Così come StackTrace indica che stai ottenendo un valore nullo da 'mRecyclerView.getChildAt (valueThisIteration)' durante una delle iterazioni. Stai semplicemente cercando di gestire i clic sugli articoli di RecyclerView? Ci sono modi migliori per farlo, se è quello che cerchi. – AdamMc331

+0

Quello è uno. Ma voglio anche ottenere l'elemento selezionato sulla visualizzazione del riciclatore. Conservalo in una variabile e così via. –

+0

Ok. Scriverò una risposta, credo di aver capito. – AdamMc331

risposta

23

Per la gestione dei clic sugli elementi in RecyclerView, si consiglia di spostare la logica nel ViewHolder dell'adapter. È possibile impostare ViewHolder su View.OnClickListener e sovrascrivere il metodo OnClick() per eseguire un'azione. Se la tua azione dipende dall'elemento cliccato, puoi fare riferimento usando getAdapterPosition(). Il codice sarà simile a questo:

public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnItemClickListener { 
    public MyViewHolder(View view) { 
     super(view); 

     view.setOnClickListener(this); 
    } 

    @Override 
    public void OnClick(View view) { 
     // Get the item clicked 
     // For this example, I'm assuming your data source is of type `List<MyObject>` 
     MyObject myObject = mDataSource.get(getAdapterPosition()); 
     // Then you can do any actions on it, for example - 
     myObject.setChecked(); 
    } 
} 

Chiaramente la logica che accade all'interno OnClick cambierà per il tuo esempio, ma spero che questo si mette sulla strada giusta. Per un altro esempio di questo, oltre a una piccola spiegazione dei vantaggi della gestione della logica di clic all'interno di ViewHolder, controlla uno blog post che ho scritto confrontando RecyclerView e ListView (cerca la sezione denominata "Ascoltatori di clic più espliciti").

+0

Grazie per questo! Ha funzionato. Ma il mio effetto a catena è finito. :/ –

+0

L'ho risolto ora. Grazie mille per questo! –

+0

@CharlesGalvez Non mentirò, non sono nemmeno riuscito a farlo. Nelle app che ho usato ho lasciato perdere perché il ripple è solo un vantaggio estetico. Lo esaminerò comunque e se riuscirò a capirlo tornerò e ti farò sapere. – AdamMc331

Problemi correlati