2016-03-16 24 views
7

Ho uno strano bug nel mio codice. Uso Recycler View (usato in passato senza alcun problema). Ho creato il test ArrayList per mostrarlo in Recycler ma ottengo l'unica prima riga in RecyclerView e dopo di esso, l'app si ferma (non si blocca) come ArrayList era finito.Perché RecyclerView onBindViewHolder ha chiamato solo una volta?

mio codice principale:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_all_tab, container, false); 

    Activity activity = getActivity(); 

    //TODO: For testing ONLY 
    ArrayList<Order> orders = new ArrayList<>(); 
    for(int i = 0; i < 10; i++) { 
     orders.add(new Order(i, i, i)); 
    } 

    // Initialising Orders Recycler View. 
    OrderAdapter orderAdapter = new OrderAdapter(activity, orders); 
    RecyclerView recyclerViewOrders = (RecyclerView) view.findViewById(R.id.recylerViewAllDiners); 
    recyclerViewOrders.setLayoutManager(new LinearLayoutManager(activity)); 
    recyclerViewOrders.setAdapter(orderAdapter); 

    return view; 
} 

Adapter:

package com.slavafleer.tipcalculator; 

import android.content.Context; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

import java.util.ArrayList; 

/** 
* Order Adapter for Order Recycler View 
*/ 
public class OrderAdapter extends RecyclerView.Adapter<OrderHolder> { 

    private Context context; 
    private ArrayList<Order> orders; 

    public OrderAdapter(Context context, ArrayList<Order> orders) { 

     this.context = context; 
     this.orders = orders; 
    } 

    @Override 
    public OrderHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     LayoutInflater layoutInflater = (LayoutInflater) 
       context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     View view = layoutInflater.inflate(R.layout.item_order, parent, false); 

     return new OrderHolder(view); 
    } 

    // TODO: why it has been done just once ? 
    @Override 
    public void onBindViewHolder(OrderHolder holder, int position) { 

     Order order = orders.get(position); 

     holder.bindOrder(order); 
    } 

    @Override 
    public int getItemCount() { 
     return orders.size(); 
    } 
} 

Holder:

package com.slavafleer.tipcalculator; 

import android.support.v7.widget.RecyclerView; 
import android.view.View; 
import android.widget.TextView; 

/** 
* Order Holder for Order Recycler View 
*/ 
public class OrderHolder extends RecyclerView.ViewHolder { 

    private TextView textViewOrderId; 
    private TextView textViewDinerId; 
    private TextView textViewPrice; 

    public OrderHolder(View itemView) { 
     super(itemView); 

     textViewOrderId = (TextView) itemView.findViewById(R.id.textViewOrderId); 
     textViewDinerId = (TextView) itemView.findViewById(R.id.textViewDinerId); 
     textViewPrice = (TextView) itemView.findViewById(R.id.textViewPrice); 
    } 

    // Bind Data Object to the Views. 
    public void bindOrder(Order order) { 

     textViewOrderId.setText(order.getOrderId() + ""); 
     textViewDinerId.setText(order.getDinerId() + ""); 
     textViewPrice.setText(order.getPrice() + ""); 
    } 


} 

risposta

7

In un primo momento, Febi Mathew, grazie per aver cercato di aiutarmi in questo.

Ho trovato come risolverlo.

La mia linea originale in Gradle era

compile 'com.android.support:recyclerview-v7:23.2.0' 

dopo che ho fatto campione solo per Recycler ed è stato lo stesso, ho provato una versione precedente

compile 'com.android.support:recyclerview-v7:23.1.1' 

e ha funzionato perfettamente. Quindi suppongo che non sia il mio bug =). Se sai come segnalare questo bug, ti invitiamo a farlo.

Aggiornamento: Ciò che è sbagliato è che non ho impostato l'altezza del layout per il mio elemento come contenuto di avvolgimento. E dalla ragione che non capisco sulla vecchia versione non importava, ma su una nuova mi basta tutto lo schermo e non ho pensato di provare a farlo scorrere.

+0

Non so se è importante, ma sto lavorando alla versione beta 6 di Android Studio 2.0 – Slava

+0

Potrebbe essere un problema con esecuzione istantanea. Hai provato un'installazione pulita di una build pulita con la libreria 23.2? – WarrenFaith

+0

WarrenFaith, non sono sicuro di cosa volevi dire (hai provato un'installazione pulita di una build pulita con la libreria 23.2?) Ma questo non è finita =) Nel mio semplice test RecyclerView ha funzionato come ho detto prima, ma sul mio progetto ha il vecchio effetto Penso che proverei a disinstallare la versione beta e a provare la stessa cosa con la versione stabile di Android Studio. – Slava

0

Puoi provare questo?

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    LayoutInflater layoutInflater = (LayoutInflater) 
      context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    View view = layoutInflater.inflate(R.layout.item_order, parent, false); 

    return new OrderHolder(view); 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    Order order = orders.get(position); 

    OrderHolder orderHolder = (OrderHolder)holder; 
    orderHolder.bindOrder(order); 
} 
+0

onBindViewHolder è @Override, quindi non posso cambiare i suoi argomenti. – Slava

+0

Sostituisci il tuo "extends RecyclerView.Adapter " con "estende RecyclerView.Adapter " –

+0

Perché dovrebbe sostituirlo quando viene esteso OrderHolder da RecyclerView.ViewHolder? Non ce n'è bisogno in questo caso – WarrenFaith

3

Ho riscontrato lo stesso problema perché è impostato il parametro di altezza errato.

Dovrebbe essere wrap_content, ma ho impostato il layout-height = match_parent.

Quindi il primo elemento della lista occuperà tutto lo spazio nella visualizzazione elenco, in modo da visualizzare solo una voce di elenco.

1

controllarla se l'elemento più esterno dell'altezza la layout voce è impostata sul valore "wrap_content". Esempio:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout mlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:tools="http://schemas.android.com/tools" 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" // Just like this! 
    > 
    <TextView 
     android:id="@+id/item_title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
    /> 
</LinearLayout> 
0

mio precedente commettere versione supporto Recyclerview: 24.2.1

Più tardi ho aggiornato build.gradle aggiungendo seguente:

> configurations.all { 
    >  resolutionStrategy.eachDependency { DependencyResolveDetails details -> 
    >   def requested = details.requested 
    >   if (requested.group == 'com.android.support') { 
    >    if (!requested.name.startsWith("multidex")) { 
    >     details.useVersion '25.3.0' 
    >    } 
    >   } 
    >  } } 

Così, dopo questo tutte le versioni di supporto sono stati aggiornati a 25.3.0 ad eccezione di "multidex". Ciò significa che anche la versione Recyclerview è stata aggiornata.

Qui è il problema, dopo l'esecuzione di un tale costruire la mia recyclerview onbindviewholder metodo non viene chiamato.

Qualsiasi come ho trovato questa causa dopo aver commentato sopra il codice e funzionante, in grado di utilizzare il mio recyclerview

Spero che questo possa utile per qualcuno.

saluti Vinod